Mercurial > hg > orthanc-databases
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); |