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 {