1 #include "include/rados.h"
2 #include "test/librados/test.h"
3 #include "test/librados/TestCase.h"
4 #include "crimson_utils.h"
8 #include "gtest/gtest.h"
13 typedef RadosTest LibRadosSnapshots
;
14 typedef RadosTest LibRadosSnapshotsSelfManaged
;
15 typedef RadosTestEC LibRadosSnapshotsEC
;
16 typedef RadosTestEC LibRadosSnapshotsSelfManagedEC
;
18 const int bufsize
= 128;
20 TEST_F(LibRadosSnapshots
, SnapList
) {
22 memset(buf
, 0xcc, sizeof(buf
));
23 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
24 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
25 rados_snap_t snaps
[10];
26 EXPECT_EQ(1, rados_ioctx_snap_list(ioctx
, snaps
,
27 sizeof(snaps
) / sizeof(snaps
[0])));
29 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
30 EXPECT_EQ(rid
, snaps
[0]);
31 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
34 TEST_F(LibRadosSnapshots
, SnapRemove
) {
36 memset(buf
, 0xcc, sizeof(buf
));
37 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
38 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
40 ASSERT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
41 ASSERT_EQ(-EEXIST
, rados_ioctx_snap_create(ioctx
, "snap1"));
42 ASSERT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
43 ASSERT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
46 TEST_F(LibRadosSnapshots
, Rollback
) {
48 memset(buf
, 0xcc, sizeof(buf
));
49 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
50 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
51 char buf2
[sizeof(buf
)];
52 memset(buf2
, 0xdd, sizeof(buf2
));
53 EXPECT_EQ(0, rados_write_full(ioctx
, "foo", buf2
, sizeof(buf2
)));
54 EXPECT_EQ(0, rados_ioctx_snap_rollback(ioctx
, "foo", "snap1"));
55 char buf3
[sizeof(buf
)];
56 EXPECT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
57 EXPECT_EQ(0, memcmp(buf
, buf3
, sizeof(buf
)));
58 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
61 TEST_F(LibRadosSnapshots
, SnapGetName
) {
63 memset(buf
, 0xcc, sizeof(buf
));
64 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
65 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snapfoo"));
67 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snapfoo", &rid
));
68 EXPECT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snapbar", &rid
));
70 memset(name
, 0, sizeof(name
));
71 EXPECT_EQ(0, rados_ioctx_snap_get_name(ioctx
, rid
, name
, sizeof(name
)));
73 EXPECT_EQ(0, rados_ioctx_snap_get_stamp(ioctx
, rid
, &snaptime
));
74 EXPECT_EQ(0, strcmp(name
, "snapfoo"));
75 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snapfoo"));
78 TEST_F(LibRadosSnapshotsSelfManaged
, Snap
) {
79 std::vector
<uint64_t> my_snaps
;
80 my_snaps
.push_back(-2);
81 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
82 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
83 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
84 &my_snaps
[0], my_snaps
.size()));
85 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
87 memset(buf
, 0xcc, sizeof(buf
));
88 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
90 my_snaps
.push_back(-2);
91 rados_completion_t completion
;
92 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
94 rados_aio_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back(), completion
);
95 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
96 rados_aio_release(completion
);
97 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
98 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
99 &my_snaps
[0], my_snaps
.size()));
100 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
101 char buf2
[sizeof(buf
)];
102 memset(buf2
, 0xdd, sizeof(buf2
));
103 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, sizeof(buf2
), 0));
104 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]-1);
105 char buf3
[sizeof(buf
)];
106 ASSERT_EQ(-ENOENT
, rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
108 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]);
109 ASSERT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
110 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
112 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
114 rados_aio_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back(), completion
);
115 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
116 rados_aio_release(completion
);
118 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
120 rados_ioctx_snap_set_read(ioctx
, LIBRADOS_SNAP_HEAD
);
121 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
124 TEST_F(LibRadosSnapshotsSelfManaged
, Rollback
) {
125 std::vector
<uint64_t> my_snaps
;
126 my_snaps
.push_back(-2);
127 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
128 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
129 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
130 &my_snaps
[0], my_snaps
.size()));
131 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
133 memset(buf
, 0xcc, sizeof(buf
));
135 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
137 my_snaps
.push_back(-2);
138 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
139 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
140 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
141 &my_snaps
[0], my_snaps
.size()));
142 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
143 char buf2
[sizeof(buf
)];
144 memset(buf2
, 0xdd, sizeof(buf2
));
146 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, sizeof(buf2
), 0));
147 // Rollback to my_snaps[1] - Object is expeceted to conatin the first write
148 rados_ioctx_selfmanaged_snap_rollback(ioctx
, "foo", my_snaps
[1]);
149 char buf3
[sizeof(buf
)];
150 ASSERT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
151 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
153 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
155 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
157 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
160 TEST_F(LibRadosSnapshotsSelfManaged
, FutureSnapRollback
) {
161 std::vector
<uint64_t> my_snaps
;
163 my_snaps
.push_back(-2);
164 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
165 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
166 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
167 &my_snaps
[0], my_snaps
.size()));
168 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
170 memset(buf
, 0xcc, sizeof(buf
));
172 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
175 my_snaps
.push_back(-2);
176 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
177 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
178 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
179 &my_snaps
[0], my_snaps
.size()));
180 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
181 char buf2
[sizeof(buf
)];
182 memset(buf2
, 0xdd, sizeof(buf2
));
184 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, sizeof(buf2
), 0));
186 my_snaps
.push_back(-2);
187 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
189 // Rollback to the last snap id - Object is expected to conatin
190 // latest write (head object)
191 rados_ioctx_selfmanaged_snap_rollback(ioctx
, "foo", my_snaps
[2]);
192 char buf3
[sizeof(buf
)];
193 ASSERT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
194 ASSERT_EQ(0, memcmp(buf3
, buf2
, sizeof(buf
)));
196 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
198 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
200 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
206 TEST_F(LibRadosSnapshotsEC
, SnapList
) {
209 memset(buf
, 0xcc, sizeof(buf
));
210 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
211 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
212 rados_snap_t snaps
[10];
213 EXPECT_EQ(1, rados_ioctx_snap_list(ioctx
, snaps
,
214 sizeof(snaps
) / sizeof(snaps
[0])));
216 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
217 EXPECT_EQ(rid
, snaps
[0]);
218 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
221 TEST_F(LibRadosSnapshotsEC
, SnapRemove
) {
224 memset(buf
, 0xcc, sizeof(buf
));
225 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
226 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
228 ASSERT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
229 ASSERT_EQ(-EEXIST
, rados_ioctx_snap_create(ioctx
, "snap1"));
230 ASSERT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
231 ASSERT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
234 TEST_F(LibRadosSnapshotsEC
, Rollback
) {
237 memset(buf
, 0xcc, sizeof(buf
));
238 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
239 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
240 char buf2
[sizeof(buf
)];
241 memset(buf2
, 0xdd, sizeof(buf2
));
242 EXPECT_EQ(0, rados_write_full(ioctx
, "foo", buf2
, sizeof(buf2
)));
243 EXPECT_EQ(0, rados_ioctx_snap_rollback(ioctx
, "foo", "snap1"));
244 char buf3
[sizeof(buf
)];
245 EXPECT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
246 EXPECT_EQ(0, memcmp(buf
, buf3
, sizeof(buf
)));
247 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
250 TEST_F(LibRadosSnapshotsEC
, SnapGetName
) {
253 memset(buf
, 0xcc, sizeof(buf
));
254 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
255 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snapfoo"));
257 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snapfoo", &rid
));
258 EXPECT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snapbar", &rid
));
260 memset(name
, 0, sizeof(name
));
261 EXPECT_EQ(0, rados_ioctx_snap_get_name(ioctx
, rid
, name
, sizeof(name
)));
263 EXPECT_EQ(0, rados_ioctx_snap_get_stamp(ioctx
, rid
, &snaptime
));
264 EXPECT_EQ(0, strcmp(name
, "snapfoo"));
265 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snapfoo"));
268 TEST_F(LibRadosSnapshotsSelfManagedEC
, Snap
) {
270 std::vector
<uint64_t> my_snaps
;
271 my_snaps
.push_back(-2);
272 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
273 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
274 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
275 &my_snaps
[0], my_snaps
.size()));
276 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
277 int bsize
= alignment
;
278 char *buf
= (char *)new char[bsize
];
279 memset(buf
, 0xcc, bsize
);
280 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, bsize
, 0));
282 my_snaps
.push_back(-2);
283 rados_completion_t completion
;
284 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
286 rados_aio_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back(), completion
);
287 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
288 rados_aio_release(completion
);
289 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
290 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
291 &my_snaps
[0], my_snaps
.size()));
292 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
293 char *buf2
= (char *)new char[bsize
];
294 memset(buf2
, 0xdd, bsize
);
295 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, bsize
, bsize
));
296 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]-1);
297 char *buf3
= (char *)new char[bsize
*2];
298 ASSERT_EQ(-ENOENT
, rados_read(ioctx
, "foo", buf3
, bsize
*2, 0));
300 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]);
301 ASSERT_EQ(bsize
, rados_read(ioctx
, "foo", buf3
, bsize
*2, 0));
302 ASSERT_EQ(0, memcmp(buf3
, buf
, bsize
));
304 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
306 rados_aio_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back(), completion
);
307 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
308 rados_aio_release(completion
);
310 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
312 rados_ioctx_snap_set_read(ioctx
, LIBRADOS_SNAP_HEAD
);
313 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
319 TEST_F(LibRadosSnapshotsSelfManagedEC
, Rollback
) {
321 std::vector
<uint64_t> my_snaps
;
322 my_snaps
.push_back(-2);
323 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
324 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
325 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
326 &my_snaps
[0], my_snaps
.size()));
327 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
328 int bsize
= alignment
;
329 char *buf
= (char *)new char[bsize
];
330 memset(buf
, 0xcc, bsize
);
331 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, bsize
, 0));
333 my_snaps
.push_back(-2);
334 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
335 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
336 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
337 &my_snaps
[0], my_snaps
.size()));
338 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
339 char *buf2
= (char *)new char[bsize
];
340 memset(buf2
, 0xdd, bsize
);
342 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, bsize
, bsize
));
343 rados_ioctx_selfmanaged_snap_rollback(ioctx
, "foo", my_snaps
[1]);
344 char *buf3
= (char *)new char[bsize
*2];
345 ASSERT_EQ(bsize
, rados_read(ioctx
, "foo", buf3
, bsize
*2, 0));
346 ASSERT_EQ(0, memcmp(buf3
, buf
, bsize
));
348 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
350 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
352 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));