Mercurial > hg > orthanc-databases
diff MySQL/UnitTests/UnitTestsMain.cpp @ 135:e26690365c25
MySQL: Added an advisory lock to avoid race conditions during database setup
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 08 May 2019 21:09:18 +0200 |
parents | 714c5d2bee76 |
children | 52b3859ee0b7 |
line wrap: on
line diff
--- a/MySQL/UnitTests/UnitTestsMain.cpp Wed May 08 20:21:13 2019 +0200 +++ b/MySQL/UnitTests/UnitTestsMain.cpp Wed May 08 21:09:18 2019 +0200 @@ -63,6 +63,46 @@ } +TEST(MySQL, Lock2) +{ + OrthancDatabases::MySQLDatabase::ClearDatabase(globalParameters_); + + OrthancDatabases::MySQLDatabase db1(globalParameters_); + db1.Open(); + + ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); // lock counter = 0 + ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 1 + + // OK, as this is the same connection + ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 2 + ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); // lock counter = 1 + + // Try and release twice the lock + ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); // lock counter = 0 + ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); // cannot unlock + ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 1 + + { + OrthancDatabases::MySQLDatabase db2(globalParameters_); + db2.Open(); + + // The "db1" is still actively locking + ASSERT_FALSE(db2.AcquireAdvisoryLock(43)); + + // Release the "db1" lock + ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); + ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); + + // "db2" can now acquire the lock, but not "db1" + ASSERT_TRUE(db2.AcquireAdvisoryLock(43)); + ASSERT_FALSE(db1.AcquireAdvisoryLock(43)); + } + + // "db2" is closed, "db1" can now acquire the lock + ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); +} + + static int64_t CountFiles(OrthancDatabases::MySQLDatabase& db) { OrthancDatabases::Query query("SELECT COUNT(*) FROM StorageArea", true);