]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/librados/lock.cc
update source to 12.2.11
[ceph.git] / ceph / src / test / librados / lock.cc
CommitLineData
7c673cae
FG
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"
6
7#include <algorithm>
8#include <errno.h>
9#include "gtest/gtest.h"
10#include <sys/time.h>
11
12using namespace librados;
13
14typedef RadosTest LibRadosLock;
15typedef RadosTestPP LibRadosLockPP;
16typedef RadosTestEC LibRadosLockEC;
17typedef RadosTestECPP LibRadosLockECPP;
18
19TEST_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));
22}
23
24TEST_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));
27}
28
29TEST_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));
32}
33
34TEST_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));
37}
38
39TEST_F(LibRadosLock, LockExclusiveDur) {
40 struct timeval tv;
41 tv.tv_sec = 1;
42 tv.tv_usec = 0;
43 ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock", "Cookie", "", &tv, 0));
44 sleep(1);
45 ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock", "Cookie", "", NULL, 0));
46}
47
48TEST_F(LibRadosLockPP, LockExclusiveDurPP) {
49 struct timeval tv;
50 tv.tv_sec = 1;
51 tv.tv_usec = 0;
52 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", &tv, 0));
53 sleep(1);
54 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, 0));
55}
56
57TEST_F(LibRadosLock, LockSharedDur) {
58 struct timeval tv;
59 tv.tv_sec = 1;
60 tv.tv_usec = 0;
61 ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLock", "Cookie", "Tag", "", &tv, 0));
62 sleep(1);
63 ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLock", "Cookie", "Tag", "", NULL, 0));
64}
65
66TEST_F(LibRadosLockPP, LockSharedDurPP) {
67 struct timeval tv;
68 tv.tv_sec = 1;
69 tv.tv_usec = 0;
70 ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLock", "Cookie", "Tag", "", &tv, 0));
71 sleep(1);
72 ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL, 0));
73}
74
f64942e4 75TEST_F(LibRadosLock, LockMayRenew) {
7c673cae
FG
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));
f64942e4 78 ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock", "Cookie", "", NULL, LOCK_FLAG_MAY_RENEW));
7c673cae
FG
79}
80
f64942e4 81TEST_F(LibRadosLockPP, LockMayRenewPP) {
7c673cae
FG
82 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, 0));
83 ASSERT_EQ(-EEXIST, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, 0));
f64942e4 84 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, LOCK_FLAG_MAY_RENEW));
7c673cae
FG
85}
86
87TEST_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));
91}
92
93TEST_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));
97}
98
99TEST_F(LibRadosLock, ListLockers) {
100 int exclusive;
101 char tag[1024];
102 char clients[1024];
103 char cookies[1024];
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 ));
117 tag_len = 1024;
118 clients_len = 1024;
119 cookies_len = 1024;
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);
129}
130
131TEST_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"));
137 {
138 int exclusive;
139 std::string tag;
140 std::list<librados::locker_t> lockers;
141 ASSERT_EQ(0, ioctx.list_lockers("foo", "TestLock", &exclusive, &tag, &lockers));
142 }
143 ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL, 0));
144 {
145 int exclusive;
146 std::string tag;
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);
153 }
154}
155
156TEST_F(LibRadosLock, BreakLock) {
157 int exclusive;
158 char tag[1024];
159 char clients[1024];
160 char cookies[1024];
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"));
179}
180
181TEST_F(LibRadosLockPP, BreakLockPP) {
182 int exclusive;
183 std::string tag;
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"));
195}
196
197// EC testing
198TEST_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));
201}
202
203TEST_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));
206}
207
208TEST_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));
211}
212
213TEST_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));
216}
217
218TEST_F(LibRadosLockEC, LockExclusiveDur) {
219 struct timeval tv;
220 tv.tv_sec = 1;
221 tv.tv_usec = 0;
222 ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock", "Cookie", "", &tv, 0));
223 sleep(1);
224 ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock", "Cookie", "", NULL, 0));
225}
226
227TEST_F(LibRadosLockECPP, LockExclusiveDurPP) {
228 struct timeval tv;
229 tv.tv_sec = 1;
230 tv.tv_usec = 0;
231 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", &tv, 0));
232 sleep(1);
233 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, 0));
234}
235
236TEST_F(LibRadosLockEC, LockSharedDur) {
237 struct timeval tv;
238 tv.tv_sec = 1;
239 tv.tv_usec = 0;
240 ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLock", "Cookie", "Tag", "", &tv, 0));
241 sleep(1);
242 ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLock", "Cookie", "Tag", "", NULL, 0));
243}
244
245TEST_F(LibRadosLockECPP, LockSharedDurPP) {
246 struct timeval tv;
247 tv.tv_sec = 1;
248 tv.tv_usec = 0;
249 ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLock", "Cookie", "Tag", "", &tv, 0));
250 sleep(1);
251 ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL, 0));
252}
253
f64942e4 254TEST_F(LibRadosLockEC, LockMayRenew) {
7c673cae
FG
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));
f64942e4 257 ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock", "Cookie", "", NULL, LOCK_FLAG_MAY_RENEW));
7c673cae
FG
258}
259
f64942e4 260TEST_F(LibRadosLockECPP, LockMayRenewPP) {
7c673cae
FG
261 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, 0));
262 ASSERT_EQ(-EEXIST, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, 0));
f64942e4 263 ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLock", "Cookie", "", NULL, LOCK_FLAG_MAY_RENEW));
7c673cae
FG
264}
265
266TEST_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));
270}
271
272TEST_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));
276}
277
278TEST_F(LibRadosLockEC, ListLockers) {
279 int exclusive;
280 char tag[1024];
281 char clients[1024];
282 char cookies[1024];
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 ));
296 tag_len = 1024;
297 clients_len = 1024;
298 cookies_len = 1024;
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);
308}
309
310TEST_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"));
316 {
317 int exclusive;
318 std::string tag;
319 std::list<librados::locker_t> lockers;
320 ASSERT_EQ(0, ioctx.list_lockers("foo", "TestLock", &exclusive, &tag, &lockers));
321 }
322 ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLock", "Cookie", "Tag", "", NULL, 0));
323 {
324 int exclusive;
325 std::string tag;
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);
332 }
333}
334
335TEST_F(LibRadosLockEC, BreakLock) {
336 int exclusive;
337 char tag[1024];
338 char clients[1024];
339 char cookies[1024];
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"));
358}
359
360TEST_F(LibRadosLockECPP, BreakLockPP) {
361 int exclusive;
362 std::string tag;
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"));
374}