1 #include "include/rados/librados.h"
2 #include "include/rados/librados.hpp"
3 #include "test/librados/test.h"
4 #include "test/librados/TestCase.h"
5 #include "cls/lock/cls_lock_client.h"
9 #include "gtest/gtest.h"
12 using namespace librados
;
14 typedef RadosTest LibRadosLock
;
15 typedef RadosTestPP LibRadosLockPP
;
16 typedef RadosTestEC LibRadosLockEC
;
17 typedef RadosTestECPP LibRadosLockECPP
;
19 TEST_F(LibRadosLock
, LockExclusive
) {
20 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
21 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
24 TEST_F(LibRadosLockPP
, LockExclusivePP
) {
25 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
26 ASSERT_EQ(-EEXIST
, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
29 TEST_F(LibRadosLock
, LockShared
) {
30 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
31 ASSERT_EQ(-EEXIST
, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
34 TEST_F(LibRadosLockPP
, LockSharedPP
) {
35 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
36 ASSERT_EQ(-EEXIST
, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
39 TEST_F(LibRadosLock
, LockExclusiveDur
) {
43 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", &tv
, 0));
45 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
48 TEST_F(LibRadosLockPP
, LockExclusiveDurPP
) {
52 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", &tv
, 0));
54 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
57 TEST_F(LibRadosLock
, LockSharedDur
) {
61 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", &tv
, 0));
63 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
66 TEST_F(LibRadosLockPP
, LockSharedDurPP
) {
70 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", &tv
, 0));
72 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
75 TEST_F(LibRadosLock
, LockMayRenew
) {
76 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
77 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
78 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
81 TEST_F(LibRadosLockPP
, LockMayRenewPP
) {
82 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
83 ASSERT_EQ(-EEXIST
, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
84 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
87 TEST_F(LibRadosLock
, Unlock
) {
88 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
89 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock", "Cookie"));
90 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
93 TEST_F(LibRadosLockPP
, UnlockPP
) {
94 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
95 ASSERT_EQ(0, ioctx
.unlock("foo", "TestLock", "Cookie"));
96 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
99 TEST_F(LibRadosLock
, ListLockers
) {
104 char addresses
[1024];
105 size_t tag_len
= 1024;
106 size_t clients_len
= 1024;
107 size_t cookies_len
= 1024;
108 size_t addresses_len
= 1024;
109 std::stringstream sstm
;
110 sstm
<< "client." << rados_get_instance_id(cluster
);
111 std::string me
= sstm
.str();
112 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
113 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock", "Cookie"));
114 ASSERT_EQ(0, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
115 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
116 ASSERT_EQ(-34, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
120 addresses_len
= 1024;
121 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
122 ASSERT_EQ(0, exclusive
);
123 ASSERT_EQ(0, strcmp(tag
, "Tag"));
124 ASSERT_EQ(strlen("Tag") + 1, tag_len
);
125 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
126 ASSERT_EQ(me
.size() + 1, clients_len
);
127 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
128 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
131 TEST_F(LibRadosLockPP
, ListLockersPP
) {
132 std::stringstream sstm
;
133 sstm
<< "client." << cluster
.get_instance_id();
134 std::string me
= sstm
.str();
135 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
136 ASSERT_EQ(0, ioctx
.unlock("foo", "TestLock", "Cookie"));
140 std::list
<librados::locker_t
> lockers
;
141 ASSERT_EQ(0, ioctx
.list_lockers("foo", "TestLock", &exclusive
, &tag
, &lockers
));
143 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
147 std::list
<librados::locker_t
> lockers
;
148 ASSERT_EQ(1, ioctx
.list_lockers("foo", "TestLock", &exclusive
, &tag
, &lockers
));
149 std::list
<librados::locker_t
>::iterator it
= lockers
.begin();
150 ASSERT_FALSE(lockers
.end() == it
);
151 ASSERT_EQ(me
, it
->client
);
152 ASSERT_EQ("Cookie", it
->cookie
);
156 TEST_F(LibRadosLock
, BreakLock
) {
161 char addresses
[1024];
162 size_t tag_len
= 1024;
163 size_t clients_len
= 1024;
164 size_t cookies_len
= 1024;
165 size_t addresses_len
= 1024;
166 std::stringstream sstm
;
167 sstm
<< "client." << rados_get_instance_id(cluster
);
168 std::string me
= sstm
.str();
169 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
170 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
171 ASSERT_EQ(1, exclusive
);
172 ASSERT_EQ(0, strcmp(tag
, ""));
173 ASSERT_EQ(1U, tag_len
);
174 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
175 ASSERT_EQ(me
.size() + 1, clients_len
);
176 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
177 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
178 ASSERT_EQ(0, rados_break_lock(ioctx
, "foo", "TestLock", clients
, "Cookie"));
181 TEST_F(LibRadosLockPP
, BreakLockPP
) {
184 std::list
<librados::locker_t
> lockers
;
185 std::stringstream sstm
;
186 sstm
<< "client." << cluster
.get_instance_id();
187 std::string me
= sstm
.str();
188 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
189 ASSERT_EQ(1, ioctx
.list_lockers("foo", "TestLock", &exclusive
, &tag
, &lockers
));
190 std::list
<librados::locker_t
>::iterator it
= lockers
.begin();
191 ASSERT_FALSE(lockers
.end() == it
);
192 ASSERT_EQ(me
, it
->client
);
193 ASSERT_EQ("Cookie", it
->cookie
);
194 ASSERT_EQ(0, ioctx
.break_lock("foo", "TestLock", it
->client
, "Cookie"));
198 TEST_F(LibRadosLockEC
, LockExclusive
) {
199 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
200 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
203 TEST_F(LibRadosLockECPP
, LockExclusivePP
) {
204 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
205 ASSERT_EQ(-EEXIST
, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
208 TEST_F(LibRadosLockEC
, LockShared
) {
209 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
210 ASSERT_EQ(-EEXIST
, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
213 TEST_F(LibRadosLockECPP
, LockSharedPP
) {
214 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
215 ASSERT_EQ(-EEXIST
, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
218 TEST_F(LibRadosLockEC
, LockExclusiveDur
) {
222 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", &tv
, 0));
224 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
227 TEST_F(LibRadosLockECPP
, LockExclusiveDurPP
) {
231 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", &tv
, 0));
233 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
236 TEST_F(LibRadosLockEC
, LockSharedDur
) {
240 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", &tv
, 0));
242 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
245 TEST_F(LibRadosLockECPP
, LockSharedDurPP
) {
249 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", &tv
, 0));
251 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
254 TEST_F(LibRadosLockEC
, LockMayRenew
) {
255 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
256 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
257 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
260 TEST_F(LibRadosLockECPP
, LockMayRenewPP
) {
261 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
262 ASSERT_EQ(-EEXIST
, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
263 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
266 TEST_F(LibRadosLockEC
, Unlock
) {
267 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
268 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock", "Cookie"));
269 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
272 TEST_F(LibRadosLockECPP
, UnlockPP
) {
273 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
274 ASSERT_EQ(0, ioctx
.unlock("foo", "TestLock", "Cookie"));
275 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
278 TEST_F(LibRadosLockEC
, ListLockers
) {
283 char addresses
[1024];
284 size_t tag_len
= 1024;
285 size_t clients_len
= 1024;
286 size_t cookies_len
= 1024;
287 size_t addresses_len
= 1024;
288 std::stringstream sstm
;
289 sstm
<< "client." << rados_get_instance_id(cluster
);
290 std::string me
= sstm
.str();
291 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
292 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock", "Cookie"));
293 ASSERT_EQ(0, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
294 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
295 ASSERT_EQ(-34, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
299 addresses_len
= 1024;
300 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
301 ASSERT_EQ(0, exclusive
);
302 ASSERT_EQ(0, strcmp(tag
, "Tag"));
303 ASSERT_EQ(strlen("Tag") + 1, tag_len
);
304 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
305 ASSERT_EQ(me
.size() + 1, clients_len
);
306 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
307 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
310 TEST_F(LibRadosLockECPP
, ListLockersPP
) {
311 std::stringstream sstm
;
312 sstm
<< "client." << cluster
.get_instance_id();
313 std::string me
= sstm
.str();
314 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
315 ASSERT_EQ(0, ioctx
.unlock("foo", "TestLock", "Cookie"));
319 std::list
<librados::locker_t
> lockers
;
320 ASSERT_EQ(0, ioctx
.list_lockers("foo", "TestLock", &exclusive
, &tag
, &lockers
));
322 ASSERT_EQ(0, ioctx
.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL
, 0));
326 std::list
<librados::locker_t
> lockers
;
327 ASSERT_EQ(1, ioctx
.list_lockers("foo", "TestLock", &exclusive
, &tag
, &lockers
));
328 std::list
<librados::locker_t
>::iterator it
= lockers
.begin();
329 ASSERT_FALSE(lockers
.end() == it
);
330 ASSERT_EQ(me
, it
->client
);
331 ASSERT_EQ("Cookie", it
->cookie
);
335 TEST_F(LibRadosLockEC
, BreakLock
) {
340 char addresses
[1024];
341 size_t tag_len
= 1024;
342 size_t clients_len
= 1024;
343 size_t cookies_len
= 1024;
344 size_t addresses_len
= 1024;
345 std::stringstream sstm
;
346 sstm
<< "client." << rados_get_instance_id(cluster
);
347 std::string me
= sstm
.str();
348 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
349 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
350 ASSERT_EQ(1, exclusive
);
351 ASSERT_EQ(0, strcmp(tag
, ""));
352 ASSERT_EQ(1U, tag_len
);
353 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
354 ASSERT_EQ(me
.size() + 1, clients_len
);
355 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
356 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
357 ASSERT_EQ(0, rados_break_lock(ioctx
, "foo", "TestLock", clients
, "Cookie"));
360 TEST_F(LibRadosLockECPP
, BreakLockPP
) {
363 std::list
<librados::locker_t
> lockers
;
364 std::stringstream sstm
;
365 sstm
<< "client." << cluster
.get_instance_id();
366 std::string me
= sstm
.str();
367 ASSERT_EQ(0, ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
368 ASSERT_EQ(1, ioctx
.list_lockers("foo", "TestLock", &exclusive
, &tag
, &lockers
));
369 std::list
<librados::locker_t
>::iterator it
= lockers
.begin();
370 ASSERT_FALSE(lockers
.end() == it
);
371 ASSERT_EQ(me
, it
->client
);
372 ASSERT_EQ("Cookie", it
->cookie
);
373 ASSERT_EQ(0, ioctx
.break_lock("foo", "TestLock", it
->client
, "Cookie"));