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);