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 #include "crimson_utils.h"
15 using namespace std::chrono_literals
;
17 typedef RadosTest LibRadosLock
;
18 typedef RadosTestEC LibRadosLockEC
;
21 TEST_F(LibRadosLock
, LockExclusive
) {
22 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock1", "Cookie", "", NULL
, 0));
23 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock1", "Cookie", "", NULL
, 0));
26 TEST_F(LibRadosLock
, LockShared
) {
27 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock2", "Cookie", "Tag", "", NULL
, 0));
28 ASSERT_EQ(-EEXIST
, rados_lock_shared(ioctx
, "foo", "TestLock2", "Cookie", "Tag", "", NULL
, 0));
31 TEST_F(LibRadosLock
, LockExclusiveDur
) {
35 auto lock_exclusive
= [this](timeval
* tv
) {
36 return rados_lock_exclusive(ioctx
, "foo", "TestLock3", "Cookie", "", tv
, 0);
38 constexpr int expected
= 0;
39 ASSERT_EQ(expected
, lock_exclusive(&tv
));
40 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_exclusive
, nullptr));
43 TEST_F(LibRadosLock
, LockSharedDur
) {
47 auto lock_shared
= [this](timeval
* tv
) {
48 return rados_lock_shared(ioctx
, "foo", "TestLock4", "Cookie", "Tag", "", tv
, 0);
50 constexpr int expected
= 0;
51 ASSERT_EQ(expected
, lock_shared(&tv
));
52 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_shared
, nullptr));
56 TEST_F(LibRadosLock
, LockMayRenew
) {
57 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock5", "Cookie", "", NULL
, 0));
58 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLock5", "Cookie", "", NULL
, 0));
59 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock5", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
62 TEST_F(LibRadosLock
, Unlock
) {
63 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock6", "Cookie", "", NULL
, 0));
64 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock6", "Cookie"));
65 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock6", "Cookie", "", NULL
, 0));
68 TEST_F(LibRadosLock
, ListLockers
) {
74 size_t tag_len
= 1024;
75 size_t clients_len
= 1024;
76 size_t cookies_len
= 1024;
77 size_t addresses_len
= 1024;
78 std::stringstream sstm
;
79 sstm
<< "client." << rados_get_instance_id(cluster
);
80 std::string me
= sstm
.str();
81 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock7", "Cookie", "Tag", "", NULL
, 0));
82 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLock7", "Cookie"));
83 ASSERT_EQ(0, rados_list_lockers(ioctx
, "foo", "TestLock7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
84 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLock7", "Cookie", "Tag", "", NULL
, 0));
85 ASSERT_EQ(-34, rados_list_lockers(ioctx
, "foo", "TestLock7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
90 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
91 ASSERT_EQ(0, exclusive
);
92 ASSERT_EQ(0, strcmp(tag
, "Tag"));
93 ASSERT_EQ(strlen("Tag") + 1, tag_len
);
94 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
95 ASSERT_EQ(me
.size() + 1, clients_len
);
96 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
97 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
100 TEST_F(LibRadosLock
, BreakLock
) {
105 char addresses
[1024];
106 size_t tag_len
= 1024;
107 size_t clients_len
= 1024;
108 size_t cookies_len
= 1024;
109 size_t addresses_len
= 1024;
110 std::stringstream sstm
;
111 sstm
<< "client." << rados_get_instance_id(cluster
);
112 std::string me
= sstm
.str();
113 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLock8", "Cookie", "", NULL
, 0));
114 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLock8", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
115 ASSERT_EQ(1, exclusive
);
116 ASSERT_EQ(0, strcmp(tag
, ""));
117 ASSERT_EQ(1U, tag_len
);
118 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
119 ASSERT_EQ(me
.size() + 1, clients_len
);
120 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
121 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
122 ASSERT_EQ(0, rados_break_lock(ioctx
, "foo", "TestLock8", clients
, "Cookie"));
126 TEST_F(LibRadosLockEC
, LockExclusive
) {
128 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC1", "Cookie", "", NULL
, 0));
129 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLockEC1", "Cookie", "", NULL
, 0));
132 TEST_F(LibRadosLockEC
, LockShared
) {
134 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLockEC2", "Cookie", "Tag", "", NULL
, 0));
135 ASSERT_EQ(-EEXIST
, rados_lock_shared(ioctx
, "foo", "TestLockEC2", "Cookie", "Tag", "", NULL
, 0));
138 TEST_F(LibRadosLockEC
, LockExclusiveDur
) {
143 auto lock_exclusive
= [this](timeval
* tv
) {
144 return rados_lock_exclusive(ioctx
, "foo", "TestLockEC3", "Cookie", "", tv
, 0);
146 constexpr int expected
= 0;
147 ASSERT_EQ(expected
, lock_exclusive(&tv
));
148 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_exclusive
, nullptr));
151 TEST_F(LibRadosLockEC
, LockSharedDur
) {
156 auto lock_shared
= [this](timeval
* tv
) {
157 return rados_lock_shared(ioctx
, "foo", "TestLockEC4", "Cookie", "Tag", "", tv
, 0);
159 constexpr int expected
= 0;
160 ASSERT_EQ(expected
, lock_shared(&tv
));
161 ASSERT_EQ(expected
, wait_until(1.0s
, 0.1s
, expected
, lock_shared
, nullptr));
165 TEST_F(LibRadosLockEC
, LockMayRenew
) {
167 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC5", "Cookie", "", NULL
, 0));
168 ASSERT_EQ(-EEXIST
, rados_lock_exclusive(ioctx
, "foo", "TestLockEC5", "Cookie", "", NULL
, 0));
169 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC5", "Cookie", "", NULL
, LOCK_FLAG_MAY_RENEW
));
172 TEST_F(LibRadosLockEC
, Unlock
) {
174 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC6", "Cookie", "", NULL
, 0));
175 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLockEC6", "Cookie"));
176 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC6", "Cookie", "", NULL
, 0));
179 TEST_F(LibRadosLockEC
, ListLockers
) {
185 char addresses
[1024];
186 size_t tag_len
= 1024;
187 size_t clients_len
= 1024;
188 size_t cookies_len
= 1024;
189 size_t addresses_len
= 1024;
190 std::stringstream sstm
;
191 sstm
<< "client." << rados_get_instance_id(cluster
);
192 std::string me
= sstm
.str();
193 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLockEC7", "Cookie", "Tag", "", NULL
, 0));
194 ASSERT_EQ(0, rados_unlock(ioctx
, "foo", "TestLockEC7", "Cookie"));
195 ASSERT_EQ(0, rados_list_lockers(ioctx
, "foo", "TestLockEC7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
196 ASSERT_EQ(0, rados_lock_shared(ioctx
, "foo", "TestLockEC7", "Cookie", "Tag", "", NULL
, 0));
197 ASSERT_EQ(-34, rados_list_lockers(ioctx
, "foo", "TestLockEC7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
201 addresses_len
= 1024;
202 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLockEC7", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
203 ASSERT_EQ(0, exclusive
);
204 ASSERT_EQ(0, strcmp(tag
, "Tag"));
205 ASSERT_EQ(strlen("Tag") + 1, tag_len
);
206 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
207 ASSERT_EQ(me
.size() + 1, clients_len
);
208 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
209 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
212 TEST_F(LibRadosLockEC
, BreakLock
) {
218 char addresses
[1024];
219 size_t tag_len
= 1024;
220 size_t clients_len
= 1024;
221 size_t cookies_len
= 1024;
222 size_t addresses_len
= 1024;
223 std::stringstream sstm
;
224 sstm
<< "client." << rados_get_instance_id(cluster
);
225 std::string me
= sstm
.str();
226 ASSERT_EQ(0, rados_lock_exclusive(ioctx
, "foo", "TestLockEC8", "Cookie", "", NULL
, 0));
227 ASSERT_EQ(1, rados_list_lockers(ioctx
, "foo", "TestLockEC8", &exclusive
, tag
, &tag_len
, clients
, &clients_len
, cookies
, &cookies_len
, addresses
, &addresses_len
));
228 ASSERT_EQ(1, exclusive
);
229 ASSERT_EQ(0, strcmp(tag
, ""));
230 ASSERT_EQ(1U, tag_len
);
231 ASSERT_EQ(0, strcmp(me
.c_str(), clients
));
232 ASSERT_EQ(me
.size() + 1, clients_len
);
233 ASSERT_EQ(0, strcmp(cookies
, "Cookie"));
234 ASSERT_EQ(strlen("Cookie") + 1, cookies_len
);
235 ASSERT_EQ(0, rados_break_lock(ioctx
, "foo", "TestLockEC8", clients
, "Cookie"));