comparison 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
comparison
equal deleted inserted replaced
134:cc3dc759c989 135:e26690365c25
61 OrthancDatabases::MySQLIndex db4(lock); 61 OrthancDatabases::MySQLIndex db4(lock);
62 db4.Open(); 62 db4.Open();
63 } 63 }
64 64
65 65
66 TEST(MySQL, Lock2)
67 {
68 OrthancDatabases::MySQLDatabase::ClearDatabase(globalParameters_);
69
70 OrthancDatabases::MySQLDatabase db1(globalParameters_);
71 db1.Open();
72
73 ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); // lock counter = 0
74 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 1
75
76 // OK, as this is the same connection
77 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 2
78 ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); // lock counter = 1
79
80 // Try and release twice the lock
81 ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); // lock counter = 0
82 ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); // cannot unlock
83 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 1
84
85 {
86 OrthancDatabases::MySQLDatabase db2(globalParameters_);
87 db2.Open();
88
89 // The "db1" is still actively locking
90 ASSERT_FALSE(db2.AcquireAdvisoryLock(43));
91
92 // Release the "db1" lock
93 ASSERT_TRUE(db1.ReleaseAdvisoryLock(43));
94 ASSERT_FALSE(db1.ReleaseAdvisoryLock(43));
95
96 // "db2" can now acquire the lock, but not "db1"
97 ASSERT_TRUE(db2.AcquireAdvisoryLock(43));
98 ASSERT_FALSE(db1.AcquireAdvisoryLock(43));
99 }
100
101 // "db2" is closed, "db1" can now acquire the lock
102 ASSERT_TRUE(db1.AcquireAdvisoryLock(43));
103 }
104
105
66 static int64_t CountFiles(OrthancDatabases::MySQLDatabase& db) 106 static int64_t CountFiles(OrthancDatabases::MySQLDatabase& db)
67 { 107 {
68 OrthancDatabases::Query query("SELECT COUNT(*) FROM StorageArea", true); 108 OrthancDatabases::Query query("SELECT COUNT(*) FROM StorageArea", true);
69 OrthancDatabases::MySQLStatement s(db, query); 109 OrthancDatabases::MySQLStatement s(db, query);
70 OrthancDatabases::MySQLTransaction t(db); 110 OrthancDatabases::MySQLTransaction t(db);