Mercurial > hg > orthanc-databases
comparison MySQL/UnitTests/UnitTestsMain.cpp @ 137:52b3859ee0b7
MySQL: acquiring named locks instead of numbers
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 09 May 2019 11:29:17 +0200 |
parents | e26690365c25 |
children | 5c5cd59c991f |
comparison
equal
deleted
inserted
replaced
136:3266785d5627 | 137:52b3859ee0b7 |
---|---|
68 OrthancDatabases::MySQLDatabase::ClearDatabase(globalParameters_); | 68 OrthancDatabases::MySQLDatabase::ClearDatabase(globalParameters_); |
69 | 69 |
70 OrthancDatabases::MySQLDatabase db1(globalParameters_); | 70 OrthancDatabases::MySQLDatabase db1(globalParameters_); |
71 db1.Open(); | 71 db1.Open(); |
72 | 72 |
73 ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); // lock counter = 0 | 73 ASSERT_FALSE(db1.ReleaseAdvisoryLock("mylock")); // lock counter = 0 |
74 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 1 | 74 ASSERT_TRUE(db1.AcquireAdvisoryLock("mylock")); // lock counter = 1 |
75 | 75 |
76 // OK, as this is the same connection | 76 // OK, as this is the same connection |
77 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 2 | 77 ASSERT_TRUE(db1.AcquireAdvisoryLock("mylock")); // lock counter = 1 |
78 ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); // lock counter = 1 | 78 ASSERT_TRUE(db1.ReleaseAdvisoryLock("mylock")); // lock counter = 0 |
79 | 79 |
80 // Try and release twice the lock | 80 // Try and release twice the lock |
81 ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); // lock counter = 0 | 81 ASSERT_FALSE(db1.ReleaseAdvisoryLock("mylock")); // lock counter = 0 |
82 ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); // cannot unlock | 82 ASSERT_TRUE(db1.AcquireAdvisoryLock("mylock")); // lock counter = 1 |
83 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); // lock counter = 1 | |
84 | 83 |
85 { | 84 { |
86 OrthancDatabases::MySQLDatabase db2(globalParameters_); | 85 OrthancDatabases::MySQLDatabase db2(globalParameters_); |
87 db2.Open(); | 86 db2.Open(); |
88 | 87 |
89 // The "db1" is still actively locking | 88 // The "db1" is still actively locking |
90 ASSERT_FALSE(db2.AcquireAdvisoryLock(43)); | 89 ASSERT_FALSE(db2.AcquireAdvisoryLock("mylock")); |
91 | 90 |
92 // Release the "db1" lock | 91 // Release the "db1" lock |
93 ASSERT_TRUE(db1.ReleaseAdvisoryLock(43)); | 92 ASSERT_TRUE(db1.ReleaseAdvisoryLock("mylock")); |
94 ASSERT_FALSE(db1.ReleaseAdvisoryLock(43)); | 93 ASSERT_FALSE(db1.ReleaseAdvisoryLock("mylock")); |
95 | 94 |
96 // "db2" can now acquire the lock, but not "db1" | 95 // "db2" can now acquire the lock, but not "db1" |
97 ASSERT_TRUE(db2.AcquireAdvisoryLock(43)); | 96 ASSERT_TRUE(db2.AcquireAdvisoryLock("mylock")); |
98 ASSERT_FALSE(db1.AcquireAdvisoryLock(43)); | 97 ASSERT_FALSE(db1.AcquireAdvisoryLock("mylock")); |
99 } | 98 } |
100 | 99 |
101 // "db2" is closed, "db1" can now acquire the lock | 100 // "db2" is closed, "db1" can now acquire the lock |
102 ASSERT_TRUE(db1.AcquireAdvisoryLock(43)); | 101 ASSERT_TRUE(db1.AcquireAdvisoryLock("mylock")); |
102 } | |
103 | |
104 | |
105 | |
106 /** | |
107 * WARNING: The following test only succeeds if MySQL >= 5.7. This is | |
108 * because in MySQL < 5.7, acquiring a lock by calling "SELECT | |
109 * GET_LOCK()" releases all the previously acquired locks! | |
110 **/ | |
111 TEST(MySQL, DISABLED_Lock3) | |
112 { | |
113 OrthancDatabases::MySQLDatabase::ClearDatabase(globalParameters_); | |
114 | |
115 OrthancDatabases::MySQLDatabase db1(globalParameters_); | |
116 db1.Open(); | |
117 | |
118 ASSERT_TRUE(db1.AcquireAdvisoryLock("mylock1")); // lock counter = 1 | |
119 ASSERT_TRUE(db1.AcquireAdvisoryLock("mylock2")); // lock counter = 1 | |
120 | |
121 { | |
122 OrthancDatabases::MySQLDatabase db2(globalParameters_); | |
123 db2.Open(); | |
124 | |
125 ASSERT_FALSE(db2.AcquireAdvisoryLock("mylock1")); | |
126 } | |
103 } | 127 } |
104 | 128 |
105 | 129 |
106 static int64_t CountFiles(OrthancDatabases::MySQLDatabase& db) | 130 static int64_t CountFiles(OrthancDatabases::MySQLDatabase& db) |
107 { | 131 { |