1 #include "include/rados.h"
2 #include "test/librados/test.h"
3 #include "test/librados/TestCase.h"
7 #include "gtest/gtest.h"
12 typedef RadosTest LibRadosSnapshots
;
13 typedef RadosTest LibRadosSnapshotsSelfManaged
;
14 typedef RadosTestEC LibRadosSnapshotsEC
;
15 typedef RadosTestEC LibRadosSnapshotsSelfManagedEC
;
17 const int bufsize
= 128;
19 TEST_F(LibRadosSnapshots
, SnapList
) {
21 memset(buf
, 0xcc, sizeof(buf
));
22 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
23 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
24 rados_snap_t snaps
[10];
25 EXPECT_EQ(1, rados_ioctx_snap_list(ioctx
, snaps
,
26 sizeof(snaps
) / sizeof(snaps
[0])));
28 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
29 EXPECT_EQ(rid
, snaps
[0]);
30 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
33 TEST_F(LibRadosSnapshots
, SnapRemove
) {
35 memset(buf
, 0xcc, sizeof(buf
));
36 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
37 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
39 ASSERT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
40 ASSERT_EQ(-EEXIST
, rados_ioctx_snap_create(ioctx
, "snap1"));
41 ASSERT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
42 ASSERT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
45 TEST_F(LibRadosSnapshots
, Rollback
) {
47 memset(buf
, 0xcc, sizeof(buf
));
48 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
49 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
50 char buf2
[sizeof(buf
)];
51 memset(buf2
, 0xdd, sizeof(buf2
));
52 EXPECT_EQ(0, rados_write_full(ioctx
, "foo", buf2
, sizeof(buf2
)));
53 EXPECT_EQ(0, rados_ioctx_snap_rollback(ioctx
, "foo", "snap1"));
54 char buf3
[sizeof(buf
)];
55 EXPECT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
56 EXPECT_EQ(0, memcmp(buf
, buf3
, sizeof(buf
)));
57 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
60 TEST_F(LibRadosSnapshots
, SnapGetName
) {
62 memset(buf
, 0xcc, sizeof(buf
));
63 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
64 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snapfoo"));
66 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snapfoo", &rid
));
67 EXPECT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snapbar", &rid
));
69 memset(name
, 0, sizeof(name
));
70 EXPECT_EQ(0, rados_ioctx_snap_get_name(ioctx
, rid
, name
, sizeof(name
)));
72 EXPECT_EQ(0, rados_ioctx_snap_get_stamp(ioctx
, rid
, &snaptime
));
73 EXPECT_EQ(0, strcmp(name
, "snapfoo"));
74 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snapfoo"));
77 TEST_F(LibRadosSnapshotsSelfManaged
, Snap
) {
78 std::vector
<uint64_t> my_snaps
;
79 my_snaps
.push_back(-2);
80 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
81 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
82 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
83 &my_snaps
[0], my_snaps
.size()));
84 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
86 memset(buf
, 0xcc, sizeof(buf
));
87 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
89 my_snaps
.push_back(-2);
90 rados_completion_t completion
;
91 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
93 rados_aio_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back(), completion
);
94 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
95 rados_aio_release(completion
);
96 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
97 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
98 &my_snaps
[0], my_snaps
.size()));
99 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
100 char buf2
[sizeof(buf
)];
101 memset(buf2
, 0xdd, sizeof(buf2
));
102 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, sizeof(buf2
), 0));
103 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]-1);
104 char buf3
[sizeof(buf
)];
105 ASSERT_EQ(-ENOENT
, rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
107 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]);
108 ASSERT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
109 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
111 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
113 rados_aio_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back(), completion
);
114 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
115 rados_aio_release(completion
);
117 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
119 rados_ioctx_snap_set_read(ioctx
, LIBRADOS_SNAP_HEAD
);
120 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
123 TEST_F(LibRadosSnapshotsSelfManaged
, Rollback
) {
124 std::vector
<uint64_t> my_snaps
;
125 my_snaps
.push_back(-2);
126 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
127 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
128 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
129 &my_snaps
[0], my_snaps
.size()));
130 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
132 memset(buf
, 0xcc, sizeof(buf
));
133 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
135 my_snaps
.push_back(-2);
136 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
137 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
138 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
139 &my_snaps
[0], my_snaps
.size()));
140 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
141 char buf2
[sizeof(buf
)];
142 memset(buf2
, 0xdd, sizeof(buf2
));
143 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, sizeof(buf2
), 0));
144 rados_ioctx_selfmanaged_snap_rollback(ioctx
, "foo", my_snaps
[1]);
145 char buf3
[sizeof(buf
)];
146 ASSERT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
147 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
149 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
151 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
153 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
157 TEST_F(LibRadosSnapshotsEC
, SnapList
) {
159 memset(buf
, 0xcc, sizeof(buf
));
160 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
161 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
162 rados_snap_t snaps
[10];
163 EXPECT_EQ(1, rados_ioctx_snap_list(ioctx
, snaps
,
164 sizeof(snaps
) / sizeof(snaps
[0])));
166 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
167 EXPECT_EQ(rid
, snaps
[0]);
168 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
171 TEST_F(LibRadosSnapshotsEC
, SnapRemove
) {
173 memset(buf
, 0xcc, sizeof(buf
));
174 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
175 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
177 ASSERT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
178 ASSERT_EQ(-EEXIST
, rados_ioctx_snap_create(ioctx
, "snap1"));
179 ASSERT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
180 ASSERT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snap1", &rid
));
183 TEST_F(LibRadosSnapshotsEC
, Rollback
) {
185 memset(buf
, 0xcc, sizeof(buf
));
186 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
187 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snap1"));
188 char buf2
[sizeof(buf
)];
189 memset(buf2
, 0xdd, sizeof(buf2
));
190 EXPECT_EQ(0, rados_write_full(ioctx
, "foo", buf2
, sizeof(buf2
)));
191 EXPECT_EQ(0, rados_ioctx_snap_rollback(ioctx
, "foo", "snap1"));
192 char buf3
[sizeof(buf
)];
193 EXPECT_EQ((int)sizeof(buf3
), rados_read(ioctx
, "foo", buf3
, sizeof(buf3
), 0));
194 EXPECT_EQ(0, memcmp(buf
, buf3
, sizeof(buf
)));
195 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snap1"));
198 TEST_F(LibRadosSnapshotsEC
, SnapGetName
) {
200 memset(buf
, 0xcc, sizeof(buf
));
201 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, sizeof(buf
), 0));
202 ASSERT_EQ(0, rados_ioctx_snap_create(ioctx
, "snapfoo"));
204 EXPECT_EQ(0, rados_ioctx_snap_lookup(ioctx
, "snapfoo", &rid
));
205 EXPECT_EQ(-ENOENT
, rados_ioctx_snap_lookup(ioctx
, "snapbar", &rid
));
207 memset(name
, 0, sizeof(name
));
208 EXPECT_EQ(0, rados_ioctx_snap_get_name(ioctx
, rid
, name
, sizeof(name
)));
210 EXPECT_EQ(0, rados_ioctx_snap_get_stamp(ioctx
, rid
, &snaptime
));
211 EXPECT_EQ(0, strcmp(name
, "snapfoo"));
212 EXPECT_EQ(0, rados_ioctx_snap_remove(ioctx
, "snapfoo"));
215 TEST_F(LibRadosSnapshotsSelfManagedEC
, Snap
) {
216 std::vector
<uint64_t> my_snaps
;
217 my_snaps
.push_back(-2);
218 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
219 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
220 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
221 &my_snaps
[0], my_snaps
.size()));
222 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
223 int bsize
= alignment
;
224 char *buf
= (char *)new char[bsize
];
225 memset(buf
, 0xcc, bsize
);
226 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, bsize
, 0));
228 my_snaps
.push_back(-2);
229 rados_completion_t completion
;
230 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
232 rados_aio_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back(), completion
);
233 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
234 rados_aio_release(completion
);
235 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
236 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
237 &my_snaps
[0], my_snaps
.size()));
238 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
239 char *buf2
= (char *)new char[bsize
];
240 memset(buf2
, 0xdd, bsize
);
241 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, bsize
, bsize
));
242 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]-1);
243 char *buf3
= (char *)new char[bsize
*2];
244 ASSERT_EQ(-ENOENT
, rados_read(ioctx
, "foo", buf3
, bsize
*2, 0));
246 rados_ioctx_snap_set_read(ioctx
, my_snaps
[1]);
247 ASSERT_EQ(bsize
, rados_read(ioctx
, "foo", buf3
, bsize
*2, 0));
248 ASSERT_EQ(0, memcmp(buf3
, buf
, bsize
));
250 ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr,
252 rados_aio_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back(), completion
);
253 ASSERT_EQ(0, rados_aio_wait_for_complete(completion
));
254 rados_aio_release(completion
);
256 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
258 rados_ioctx_snap_set_read(ioctx
, LIBRADOS_SNAP_HEAD
);
259 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));
265 TEST_F(LibRadosSnapshotsSelfManagedEC
, Rollback
) {
266 std::vector
<uint64_t> my_snaps
;
267 my_snaps
.push_back(-2);
268 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
269 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
270 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
271 &my_snaps
[0], my_snaps
.size()));
272 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
273 int bsize
= alignment
;
274 char *buf
= (char *)new char[bsize
];
275 memset(buf
, 0xcc, bsize
);
276 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf
, bsize
, 0));
278 my_snaps
.push_back(-2);
279 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_create(ioctx
, &my_snaps
.back()));
280 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
281 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_set_write_ctx(ioctx
, my_snaps
[0],
282 &my_snaps
[0], my_snaps
.size()));
283 ::std::reverse(my_snaps
.begin(), my_snaps
.end());
284 char *buf2
= (char *)new char[bsize
];
285 memset(buf2
, 0xdd, bsize
);
287 ASSERT_EQ(0, rados_write(ioctx
, "foo", buf2
, bsize
, bsize
));
288 rados_ioctx_selfmanaged_snap_rollback(ioctx
, "foo", my_snaps
[1]);
289 char *buf3
= (char *)new char[bsize
*2];
290 ASSERT_EQ(bsize
, rados_read(ioctx
, "foo", buf3
, bsize
*2, 0));
291 ASSERT_EQ(0, memcmp(buf3
, buf
, bsize
));
293 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
295 ASSERT_EQ(0, rados_ioctx_selfmanaged_snap_remove(ioctx
, my_snaps
.back()));
297 ASSERT_EQ(0, rados_remove(ioctx
, "foo"));