1 #include "include/rados/librados.h"
2 #include "test/librados/test.h"
3 #include "test/librados/TestCase.h"
4 #include "cls/lock/cls_lock_client.h"
10 #include "gtest/gtest.h"
13 using namespace std::chrono_literals
;
15 typedef RadosTest LibRadosLock
;
16 typedef RadosTestEC LibRadosLockEC
;
19 TEST_F(LibRadosLock
, LockExclusive
) {
20 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock1", "Cookie", "", NULL
, 0));
21 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock1", "Cookie", "", NULL
, 0));
24 TEST_F(LibRadosLock
, LockShared
) {
25 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock2", "Cookie", "Tag", "", NULL
, 0));
26 ASSERT_EQ(-EEXIST
, rados_lock_shared(ioctx
, "foo", "TestLock2", "Cookie", "Tag", "", NULL
, 0));
29 TEST_F(LibRadosLock
, LockExclusiveDur
) {
33 auto lock_exclusive
= [this](timeval
* tv
) {
34 return rados_lock_exclusive(ioctx
, "foo", "TestLock3", "Cookie", "", tv
, 0);
36 constexpr int expected
= 0;
37 ASSERT_EQ(expected
, lock_exclusive(&tv
));
38 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_exclusive
, nullptr));
41 TEST_F(LibRadosLock
, LockSharedDur
) {
45 auto lock_shared
= [this](timeval
* tv
) {
46 return rados_lock_shared(ioctx
, "foo", "TestLock4", "Cookie", "Tag", "", tv
, 0);
48 constexpr int expected
= 0;
49 ASSERT_EQ(expected
, lock_shared(&tv
));
50 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_shared
, nullptr));
54 TEST_F(LibRadosLock
, LockMayRenew
) {
55 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock5", "Cookie", "", NULL
, 0));
56 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock5", "Cookie", "", NULL
, 0));
57 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock5", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
60 TEST_F(LibRadosLock
, Unlock
) {
61 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock6", "Cookie", "", NULL
, 0));
62 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock6", "Cookie"));
63 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock6", "Cookie", "", NULL
, 0));
66 TEST_F(LibRadosLock
, ListLockers
) {
72 size_t tag_len
= 1024;
73 size_t clients_len
= 1024;
74 size_t cookies_len
= 1024;
75 size_t addresses_len
= 1024;
76 std::stringstream sstm
;
77 sstm
<< "client." << rados_get_instance_id(cluster
);
78 std::string me
= sstm
.str();
79 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock7", "Cookie", "Tag", "", NULL
, 0));
80 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock7", "Cookie"));
81 ASSERT_EQ(0, rados_list_lockers(ioctx
, "foo", "TestLock7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
82 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock7", "Cookie", "Tag", "", NULL
, 0));
83 ASSERT_EQ(-34, rados_list_lockers(ioctx
, "foo", "TestLock7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
88 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
89 ASSERT_EQ(0, exclusive
);
90 ASSERT_EQ(0, strcmp(tag
, "Tag"));
91 ASSERT_EQ(strlen("Tag") + 1, tag_len
);
92 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
93 ASSERT_EQ(me
.size() + 1, clients_len
);
94 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
95 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
98 TEST_F(LibRadosLock
, BreakLock
) {
103 char addresses
[1024];
104 size_t tag_len
= 1024;
105 size_t clients_len
= 1024;
106 size_t cookies_len
= 1024;
107 size_t addresses_len
= 1024;
108 std::stringstream sstm
;
109 sstm
<< "client." << rados_get_instance_id(cluster
);
110 std::string me
= sstm
.str();
111 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock8", "Cookie", "", NULL
, 0));
112 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock8", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
113 ASSERT_EQ(1, exclusive
);
114 ASSERT_EQ(0, strcmp(tag
, ""));
115 ASSERT_EQ(1U, tag_len
);
116 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
117 ASSERT_EQ(me
.size() + 1, clients_len
);
118 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
119 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
120 ASSERT_EQ(0, rados_break_lock(ioctx
, "foo", "TestLock8", clients
, "Cookie"));
124 TEST_F(LibRadosLockEC
, LockExclusive
) {
125 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC1", "Cookie", "", NULL
, 0));
126 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLockEC1", "Cookie", "", NULL
, 0));
129 TEST_F(LibRadosLockEC
, LockShared
) {
130 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLockEC2", "Cookie", "Tag", "", NULL
, 0));
131 ASSERT_EQ(-EEXIST
, rados_lock_shared(ioctx
, "foo", "TestLockEC2", "Cookie", "Tag", "", NULL
, 0));
134 TEST_F(LibRadosLockEC
, LockExclusiveDur
) {
138 auto lock_exclusive
= [this](timeval
* tv
) {
139 return rados_lock_exclusive(ioctx
, "foo", "TestLockEC3", "Cookie", "", tv
, 0);
141 constexpr int expected
= 0;
142 ASSERT_EQ(expected
, lock_exclusive(&tv
));
143 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_exclusive
, nullptr));
146 TEST_F(LibRadosLockEC
, LockSharedDur
) {
150 auto lock_shared
= [this](timeval
* tv
) {
151 return rados_lock_shared(ioctx
, "foo", "TestLockEC4", "Cookie", "Tag", "", tv
, 0);
153 constexpr int expected
= 0;
154 ASSERT_EQ(expected
, lock_shared(&tv
));
155 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_shared
, nullptr));
159 TEST_F(LibRadosLockEC
, LockMayRenew
) {
160 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC5", "Cookie", "", NULL
, 0));
161 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLockEC5", "Cookie", "", NULL
, 0));
162 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC5", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
165 TEST_F(LibRadosLockEC
, Unlock
) {
166 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC6", "Cookie", "", NULL
, 0));
167 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLockEC6", "Cookie"));
168 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC6", "Cookie", "", NULL
, 0));
171 TEST_F(LibRadosLockEC
, ListLockers
) {
176 char addresses
[1024];
177 size_t tag_len
= 1024;
178 size_t clients_len
= 1024;
179 size_t cookies_len
= 1024;
180 size_t addresses_len
= 1024;
181 std::stringstream sstm
;
182 sstm
<< "client." << rados_get_instance_id(cluster
);
183 std::string me
= sstm
.str();
184 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLockEC7", "Cookie", "Tag", "", NULL
, 0));
185 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLockEC7", "Cookie"));
186 ASSERT_EQ(0, rados_list_lockers(ioctx
, "foo", "TestLockEC7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
187 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLockEC7", "Cookie", "Tag", "", NULL
, 0));
188 ASSERT_EQ(-34, rados_list_lockers(ioctx
, "foo", "TestLockEC7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
192 addresses_len
= 1024;
193 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLockEC7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
194 ASSERT_EQ(0, exclusive
);
195 ASSERT_EQ(0, strcmp(tag
, "Tag"));
196 ASSERT_EQ(strlen("Tag") + 1, tag_len
);
197 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
198 ASSERT_EQ(me
.size() + 1, clients_len
);
199 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
200 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
203 TEST_F(LibRadosLockEC
, BreakLock
) {
208 char addresses
[1024];
209 size_t tag_len
= 1024;
210 size_t clients_len
= 1024;
211 size_t cookies_len
= 1024;
212 size_t addresses_len
= 1024;
213 std::stringstream sstm
;
214 sstm
<< "client." << rados_get_instance_id(cluster
);
215 std::string me
= sstm
.str();
216 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC8", "Cookie", "", NULL
, 0));
217 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLockEC8", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
218 ASSERT_EQ(1, exclusive
);
219 ASSERT_EQ(0, strcmp(tag
, ""));
220 ASSERT_EQ(1U, tag_len
);
221 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
222 ASSERT_EQ(me
.size() + 1, clients_len
);
223 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
224 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
225 ASSERT_EQ(0, rados_break_lock(ioctx
, "foo", "TestLockEC8", clients
, "Cookie"));