# HG changeset patch # User Sebastien Jodogne # Date 1625033992 -7200 # Node ID 0868500060f39b5842ff531c9e44347280cb44ad # Parent 6d4d413a87970164734b2b22bc85bc840c0ea5c0 Fix serialization of large jobs diff -r 6d4d413a8797 -r 0868500060f3 Framework/Plugins/IndexUnitTests.h --- a/Framework/Plugins/IndexUnitTests.h Mon Jun 28 15:34:49 2021 +0200 +++ b/Framework/Plugins/IndexUnitTests.h Wed Jun 30 08:19:52 2021 +0200 @@ -523,7 +523,8 @@ ASSERT_EQ(p1, r); { - // Test creating a large property of 16MB + // Test creating a large property of 16MB (large properties are + // notably necessary to serialize jobs) // https://groups.google.com/g/orthanc-users/c/1Y3nTBdr0uE/m/K7PA5pboAgAJ std::string longProperty; longProperty.resize(16 * 1024 * 1024); @@ -534,9 +535,17 @@ db.SetGlobalProperty(*manager, MISSING_SERVER_IDENTIFIER, Orthanc::GlobalProperty_DatabaseInternal8, longProperty.c_str()); + // The following line fails on MySQL 4.0 because the "value" + // column in "ServerProperties" is "TEXT" instead of "LONGTEXT" + db.SetGlobalProperty(*manager, "some-server", Orthanc::GlobalProperty_DatabaseInternal8, longProperty.c_str()); + std::string tmp; ASSERT_TRUE(db.LookupGlobalProperty(tmp, *manager, MISSING_SERVER_IDENTIFIER, Orthanc::GlobalProperty_DatabaseInternal8)); ASSERT_EQ(longProperty, tmp); + + tmp.clear(); + ASSERT_TRUE(db.LookupGlobalProperty(tmp, *manager, "some-server", Orthanc::GlobalProperty_DatabaseInternal8)); + ASSERT_EQ(longProperty, tmp); } manager->Close(); diff -r 6d4d413a8797 -r 0868500060f3 MySQL/NEWS --- a/MySQL/NEWS Mon Jun 28 15:34:49 2021 +0200 +++ b/MySQL/NEWS Wed Jun 30 08:19:52 2021 +0200 @@ -1,6 +1,8 @@ Pending changes in the mainline =============================== +* Fix serialization of large jobs + Release 4.0 (2021-04-23) ======================== diff -r 6d4d413a8797 -r 0868500060f3 MySQL/Plugins/MySQLIndex.cpp --- a/MySQL/Plugins/MySQLIndex.cpp Mon Jun 28 15:34:49 2021 +0200 +++ b/MySQL/Plugins/MySQLIndex.cpp Wed Jun 30 08:19:52 2021 +0200 @@ -261,26 +261,44 @@ t.Commit(); } - - if (revision != 5) + + if (revision == 5) + { + // Added new table "ServerProperties" since release 4.0 to deal with multiple writers + DatabaseManager::Transaction t(manager, TransactionType_ReadWrite); + + if (t.GetDatabaseTransaction().DoesTableExist("ServerProperties")) + { + /** + * Patch for MySQL plugin 4.0, where the column "value" was + * "TEXT" instead of "LONGTEXT", which prevented + * serialization of large jobs. This was giving error "MySQL + * error (1406,22001): Data too long for column 'value' at + * row 1" after log message "Serializing the content of the + * jobs engine" (in --trace mode). + * https://groups.google.com/g/orthanc-users/c/1Y3nTBdr0uE/m/K7PA5pboAgAJ + **/ + t.GetDatabaseTransaction().ExecuteMultiLines("ALTER TABLE ServerProperties MODIFY value LONGTEXT"); + } + else + { + t.GetDatabaseTransaction().ExecuteMultiLines("CREATE TABLE ServerProperties(server VARCHAR(64) NOT NULL, " + "property INTEGER, value LONGTEXT, PRIMARY KEY(server, property))"); + } + + // Revision 6 indicates that "value" of "ServerProperties" is + // "LONGTEXT", whereas revision 5 corresponds to "TEXT" + revision = 6; + SetGlobalIntegerProperty(manager, MISSING_SERVER_IDENTIFIER, Orthanc::GlobalProperty_DatabasePatchLevel, revision); + + t.Commit(); + } + + if (revision != 6) { LOG(ERROR) << "MySQL plugin is incompatible with database schema revision: " << revision; throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); } - - - { - // New in release 4.0 to deal with multiple writers - DatabaseManager::Transaction t(manager, TransactionType_ReadWrite); - - if (!t.GetDatabaseTransaction().DoesTableExist("ServerProperties")) - { - t.GetDatabaseTransaction().ExecuteMultiLines("CREATE TABLE ServerProperties(server VARCHAR(64) NOT NULL, " - "property INTEGER, value TEXT, PRIMARY KEY(server, property))"); - } - - t.Commit(); - } }