]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/libradosstriper/io.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / test / libradosstriper / io.cc
1 #include "include/rados/librados.h"
2 #include "include/rados/librados.hpp"
3 #include "include/radosstriper/libradosstriper.h"
4 #include "include/radosstriper/libradosstriper.hpp"
5 #include "test/librados/test.h"
6 #include "test/libradosstriper/TestCase.h"
7
8 #include <fcntl.h>
9 #include <errno.h>
10 #include "gtest/gtest.h"
11
12 using namespace librados;
13 using namespace libradosstriper;
14 using std::string;
15
16 TEST_F(StriperTest, SimpleWrite) {
17 char buf[128];
18 memset(buf, 0xcc, sizeof(buf));
19 ASSERT_EQ(0, rados_striper_write(striper, "SimpleWrite", buf, sizeof(buf), 0));
20 }
21
22 TEST_F(StriperTestPP, SimpleWritePP) {
23 char buf[128];
24 memset(buf, 0xcc, sizeof(buf));
25 bufferlist bl;
26 bl.append(buf, sizeof(buf));
27 ASSERT_EQ(0, striper.write("SimpleWritePP", bl, sizeof(buf), 0));
28 }
29
30 TEST_F(StriperTest, SimpleWriteFull) {
31 char buf[128];
32 memset(buf, 0xcc, sizeof(buf));
33 ASSERT_EQ(0, rados_striper_write_full(striper, "SimpleWrite", buf, sizeof(buf)));
34 }
35
36 TEST_F(StriperTestPP, SimpleWriteFullPP) {
37 char buf[128];
38 memset(buf, 0xcc, sizeof(buf));
39 bufferlist bl;
40 bl.append(buf, sizeof(buf));
41 ASSERT_EQ(0, striper.write_full("SimpleWritePP", bl));
42 }
43
44 TEST_F(StriperTest, Stat) {
45 uint64_t psize;
46 time_t pmtime;
47 char buf[128];
48 memset(buf, 0xcc, sizeof(buf));
49 ASSERT_EQ(0, rados_striper_write(striper, "Stat", buf, sizeof(buf), 0));
50 ASSERT_EQ(0, rados_striper_stat(striper, "Stat", &psize, &pmtime));
51 ASSERT_EQ(psize, sizeof(buf));
52 ASSERT_EQ(-ENOENT, rados_striper_stat(striper, "nonexistent", &psize, &pmtime));
53 }
54
55 TEST_F(StriperTestPP, StatPP) {
56 char buf[128];
57 memset(buf, 0xcc, sizeof(buf));
58 bufferlist bl;
59 bl.append(buf, sizeof(buf));
60 ASSERT_EQ(0, striper.write("Statpp", bl, sizeof(buf), 0));
61 uint64_t psize;
62 time_t pmtime;
63 ASSERT_EQ(0, striper.stat("Statpp", &psize, &pmtime));
64 ASSERT_EQ(psize, sizeof(buf));
65 ASSERT_EQ(-ENOENT, striper.stat("nonexistent", &psize, &pmtime));
66 }
67
68 TEST_F(StriperTest, RoundTrip) {
69 char buf[128];
70 char buf2[sizeof(buf)];
71 memset(buf, 0xcc, sizeof(buf));
72 ASSERT_EQ(0, rados_striper_write(striper, "RoundTrip", buf, sizeof(buf), 0));
73 memset(buf2, 0, sizeof(buf2));
74 ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "RoundTrip", buf2, sizeof(buf2), 0));
75 ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
76 }
77
78 TEST_F(StriperTestPP, RoundTripPP) {
79 char buf[128];
80 memset(buf, 0xcc, sizeof(buf));
81 bufferlist bl;
82 bl.append(buf, sizeof(buf));
83 ASSERT_EQ(0, striper.write("RoundTripPP", bl, sizeof(buf), 0));
84 bufferlist cl;
85 ASSERT_EQ((int)sizeof(buf), striper.read("RoundTripPP", &cl, sizeof(buf), 0));
86 ASSERT_EQ(0, memcmp(buf, cl.c_str(), sizeof(buf)));
87 }
88
89 TEST_F(StriperTest, OverlappingWriteRoundTrip) {
90 char buf[128];
91 char buf2[64];
92 char buf3[sizeof(buf)];
93 memset(buf, 0xcc, sizeof(buf));
94 ASSERT_EQ(0, rados_striper_write(striper, "OverlappingWriteRoundTrip", buf, sizeof(buf), 0));
95 memset(buf2, 0xdd, sizeof(buf2));
96 ASSERT_EQ(0, rados_striper_write(striper, "OverlappingWriteRoundTrip", buf2, sizeof(buf2), 0));
97 memset(buf3, 0, sizeof(buf3));
98 ASSERT_EQ((int)sizeof(buf3), rados_striper_read(striper, "OverlappingWriteRoundTrip", buf3, sizeof(buf3), 0));
99 ASSERT_EQ(0, memcmp(buf3, buf2, sizeof(buf2)));
100 ASSERT_EQ(0, memcmp(buf3 + sizeof(buf2), buf, sizeof(buf) - sizeof(buf2)));
101 }
102
103 TEST_F(StriperTestPP, OverlappingWriteRoundTripPP) {
104 char buf[128];
105 memset(buf, 0xcc, sizeof(buf));
106 bufferlist bl1;
107 bl1.append(buf, sizeof(buf));
108 ASSERT_EQ(0, striper.write("OverlappingWriteRoundTripPP", bl1, sizeof(buf), 0));
109 char buf2[64];
110 memset(buf2, 0xdd, sizeof(buf2));
111 bufferlist bl2;
112 bl2.append(buf2, sizeof(buf2));
113 ASSERT_EQ(0, striper.write("OverlappingWriteRoundTripPP", bl2, sizeof(buf2), 0));
114 bufferlist bl3;
115 ASSERT_EQ((int)sizeof(buf), striper.read("OverlappingWriteRoundTripPP", &bl3, sizeof(buf), 0));
116 ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2)));
117 ASSERT_EQ(0, memcmp(bl3.c_str() + sizeof(buf2), buf, sizeof(buf) - sizeof(buf2)));
118 }
119
120 TEST_F(StriperTest, SparseWriteRoundTrip) {
121 char buf[128];
122 char buf2[2*sizeof(buf)];
123 memset(buf, 0xcc, sizeof(buf));
124 ASSERT_EQ(0, rados_striper_write(striper, "SparseWriteRoundTrip", buf, sizeof(buf), 0));
125 ASSERT_EQ(0, rados_striper_write(striper, "SparseWriteRoundTrip", buf, sizeof(buf), 1000000000));
126 memset(buf2, 0xaa, sizeof(buf2));
127 ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "SparseWriteRoundTrip", buf2, sizeof(buf2), 0));
128 ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
129 memset(buf, 0, sizeof(buf));
130 ASSERT_EQ(0, memcmp(buf, buf2+sizeof(buf), sizeof(buf)));
131 memset(buf2, 0xaa, sizeof(buf2));
132 ASSERT_EQ((int)sizeof(buf), rados_striper_read(striper, "SparseWriteRoundTrip", buf2, sizeof(buf), 500000000));
133 ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
134 }
135
136 TEST_F(StriperTestPP, SparseWriteRoundTripPP) {
137 char buf[128];
138 memset(buf, 0xcc, sizeof(buf));
139 bufferlist bl1;
140 bl1.append(buf, sizeof(buf));
141 ASSERT_EQ(0, striper.write("SparseWriteRoundTripPP", bl1, sizeof(buf), 0));
142 ASSERT_EQ(0, striper.write("SparseWriteRoundTripPP", bl1, sizeof(buf), 1000000000));
143 bufferlist bl2;
144 ASSERT_EQ((int)(2*sizeof(buf)), striper.read("SparseWriteRoundTripPP", &bl2, 2*sizeof(buf), 0));
145 ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)));
146 memset(buf, 0, sizeof(buf));
147 ASSERT_EQ(0, memcmp(bl2.c_str()+sizeof(buf), buf, sizeof(buf)));
148 ASSERT_EQ((int)sizeof(buf), striper.read("SparseWriteRoundTripPP", &bl2, sizeof(buf), 500000000));
149 ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)));
150 }
151
152 TEST_F(StriperTest, WriteFullRoundTrip) {
153 char buf[128];
154 char buf2[64];
155 char buf3[128];
156 memset(buf, 0xcc, sizeof(buf));
157 ASSERT_EQ(0, rados_striper_write(striper, "WriteFullRoundTrip", buf, sizeof(buf), 0));
158 memset(buf2, 0xdd, sizeof(buf2));
159 ASSERT_EQ(0, rados_striper_write_full(striper, "WriteFullRoundTrip", buf2, sizeof(buf2)));
160 memset(buf3, 0x00, sizeof(buf3));
161 ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "WriteFullRoundTrip", buf3, sizeof(buf3), 0));
162 ASSERT_EQ(0, memcmp(buf2, buf3, sizeof(buf2)));
163 }
164
165 TEST_F(StriperTestPP, WriteFullRoundTripPP) {
166 char buf[128];
167 char buf2[64];
168 memset(buf, 0xcc, sizeof(buf));
169 bufferlist bl1;
170 bl1.append(buf, sizeof(buf));
171 ASSERT_EQ(0, striper.write("WriteFullRoundTripPP", bl1, sizeof(buf), 0));
172 memset(buf2, 0xdd, sizeof(buf2));
173 bufferlist bl2;
174 bl2.append(buf2, sizeof(buf2));
175 ASSERT_EQ(0, striper.write_full("WriteFullRoundTripPP", bl2));
176 bufferlist bl3;
177 ASSERT_EQ((int)sizeof(buf2), striper.read("WriteFullRoundTripPP", &bl3, sizeof(buf), 0));
178 ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2)));
179 }
180
181 TEST_F(StriperTest, AppendRoundTrip) {
182 char buf[64];
183 char buf2[64];
184 char buf3[sizeof(buf) + sizeof(buf2)];
185 memset(buf, 0xde, sizeof(buf));
186 ASSERT_EQ(0, rados_striper_append(striper, "AppendRoundTrip", buf, sizeof(buf)));
187 memset(buf2, 0xad, sizeof(buf2));
188 ASSERT_EQ(0, rados_striper_append(striper, "AppendRoundTrip", buf2, sizeof(buf2)));
189 memset(buf3, 0, sizeof(buf3));
190 ASSERT_EQ((int)sizeof(buf3), rados_striper_read(striper, "AppendRoundTrip", buf3, sizeof(buf3), 0));
191 ASSERT_EQ(0, memcmp(buf3, buf, sizeof(buf)));
192 ASSERT_EQ(0, memcmp(buf3 + sizeof(buf), buf2, sizeof(buf2)));
193 }
194
195 TEST_F(StriperTestPP, AppendRoundTripPP) {
196 char buf[64];
197 char buf2[64];
198 memset(buf, 0xde, sizeof(buf));
199 bufferlist bl1;
200 bl1.append(buf, sizeof(buf));
201 ASSERT_EQ(0, striper.append("AppendRoundTripPP", bl1, sizeof(buf)));
202 memset(buf2, 0xad, sizeof(buf2));
203 bufferlist bl2;
204 bl2.append(buf2, sizeof(buf2));
205 ASSERT_EQ(0, striper.append("AppendRoundTripPP", bl2, sizeof(buf2)));
206 bufferlist bl3;
207 ASSERT_EQ((int)(sizeof(buf) + sizeof(buf2)),
208 striper.read("AppendRoundTripPP", &bl3, (sizeof(buf) + sizeof(buf2)), 0));
209 const char *bl3_str = bl3.c_str();
210 ASSERT_EQ(0, memcmp(bl3_str, buf, sizeof(buf)));
211 ASSERT_EQ(0, memcmp(bl3_str + sizeof(buf), buf2, sizeof(buf2)));
212 }
213
214 TEST_F(StriperTest, TruncTest) {
215 char buf[128];
216 char buf2[sizeof(buf)];
217 memset(buf, 0xaa, sizeof(buf));
218 ASSERT_EQ(0, rados_striper_append(striper, "TruncTest", buf, sizeof(buf)));
219 ASSERT_EQ(0, rados_striper_trunc(striper, "TruncTest", sizeof(buf) / 2));
220 memset(buf2, 0, sizeof(buf2));
221 ASSERT_EQ((int)(sizeof(buf)/2), rados_striper_read(striper, "TruncTest", buf2, sizeof(buf2), 0));
222 ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)/2));
223 }
224
225 TEST_F(StriperTestPP, TruncTestPP) {
226 char buf[128];
227 memset(buf, 0xaa, sizeof(buf));
228 bufferlist bl;
229 bl.append(buf, sizeof(buf));
230 ASSERT_EQ(0, striper.append("TruncTestPP", bl, sizeof(buf)));
231 ASSERT_EQ(0, striper.trunc("TruncTestPP", sizeof(buf) / 2));
232 bufferlist bl2;
233 ASSERT_EQ((int)(sizeof(buf)/2), striper.read("TruncTestPP", &bl2, sizeof(buf), 0));
234 ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)/2));
235 }
236
237 TEST_F(StriperTest, TruncTestGrow) {
238 char buf[128];
239 char buf2[sizeof(buf)*2];
240 memset(buf, 0xaa, sizeof(buf));
241 ASSERT_EQ(0, rados_striper_append(striper, "TruncTestGrow", buf, sizeof(buf)));
242 ASSERT_EQ(0, rados_striper_trunc(striper, "TruncTestGrow", sizeof(buf2)));
243 memset(buf2, 0xbb, sizeof(buf2));
244 ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "TruncTestGrow", buf2, sizeof(buf2), 0));
245 ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
246 memset(buf, 0x00, sizeof(buf));
247 ASSERT_EQ(0, memcmp(buf, buf2+sizeof(buf), sizeof(buf)));
248 }
249
250 TEST_F(StriperTestPP, TruncTestGrowPP) {
251 char buf[128];
252 memset(buf, 0xaa, sizeof(buf));
253 bufferlist bl;
254 bl.append(buf, sizeof(buf));
255 ASSERT_EQ(0, striper.append("TruncTestGrowPP", bl, sizeof(buf)));
256 ASSERT_EQ(0, striper.trunc("TruncTestGrowPP", sizeof(buf) * 2));
257 bufferlist bl2;
258 ASSERT_EQ(sizeof(buf)*2, (unsigned)striper.read("TruncTestGrowPP", &bl2, sizeof(buf)*2, 0));
259 ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)));
260 memset(buf, 0x00, sizeof(buf));
261 ASSERT_EQ(0, memcmp(bl2.c_str()+sizeof(buf), buf, sizeof(buf)));
262 }
263
264 TEST_F(StriperTest, RemoveTest) {
265 char buf[128];
266 char buf2[sizeof(buf)];
267 memset(buf, 0xaa, sizeof(buf));
268 ASSERT_EQ(0, rados_striper_write(striper, "RemoveTest", buf, sizeof(buf), 0));
269 ASSERT_EQ(0, rados_striper_remove(striper, "RemoveTest"));
270 ASSERT_EQ(-ENOENT, rados_striper_read(striper, "RemoveTest", buf2, sizeof(buf2), 0));
271 }
272
273 TEST_F(StriperTestPP, RemoveTestPP) {
274 char buf[128];
275 memset(buf, 0xaa, sizeof(buf));
276 bufferlist bl;
277 bl.append(buf, sizeof(buf));
278 ASSERT_EQ(0, striper.write("RemoveTestPP", bl, sizeof(buf), 0));
279 ASSERT_EQ(0, striper.remove("RemoveTestPP"));
280 bufferlist bl2;
281 ASSERT_EQ(-ENOENT, striper.read("RemoveTestPP", &bl2, sizeof(buf), 0));
282 }
283
284 TEST_F(StriperTest, XattrsRoundTrip) {
285 char buf[128];
286 char attr1_buf[] = "foo bar baz";
287 memset(buf, 0xaa, sizeof(buf));
288 ASSERT_EQ(0, rados_striper_write(striper, "XattrsRoundTrip", buf, sizeof(buf), 0));
289 ASSERT_EQ(-ENODATA, rados_striper_getxattr(striper, "XattrsRoundTrip", "attr1", buf, sizeof(buf)));
290 ASSERT_EQ(0, rados_striper_setxattr(striper, "XattrsRoundTrip", "attr1", attr1_buf, sizeof(attr1_buf)));
291 ASSERT_EQ((int)sizeof(attr1_buf), rados_striper_getxattr(striper, "XattrsRoundTrip", "attr1", buf, sizeof(buf)));
292 ASSERT_EQ(0, memcmp(attr1_buf, buf, sizeof(attr1_buf)));
293 }
294
295 TEST_F(StriperTestPP, XattrsRoundTripPP) {
296 char buf[128];
297 memset(buf, 0xaa, sizeof(buf));
298 bufferlist bl1;
299 bl1.append(buf, sizeof(buf));
300 ASSERT_EQ(0, striper.write("XattrsRoundTripPP", bl1, sizeof(buf), 0));
301 char attr1_buf[] = "foo bar baz";
302 bufferlist bl2;
303 ASSERT_EQ(-ENODATA, striper.getxattr("XattrsRoundTripPP", "attr1", bl2));
304 bufferlist bl3;
305 bl3.append(attr1_buf, sizeof(attr1_buf));
306 ASSERT_EQ(0, striper.setxattr("XattrsRoundTripPP", "attr1", bl3));
307 bufferlist bl4;
308 ASSERT_EQ((int)sizeof(attr1_buf), striper.getxattr("XattrsRoundTripPP", "attr1", bl4));
309 ASSERT_EQ(0, memcmp(bl4.c_str(), attr1_buf, sizeof(attr1_buf)));
310 }
311
312 TEST_F(StriperTest, RmXattr) {
313 char buf[128];
314 char attr1_buf[] = "foo bar baz";
315 memset(buf, 0xaa, sizeof(buf));
316 ASSERT_EQ(0, rados_striper_write(striper, "RmXattr", buf, sizeof(buf), 0));
317 ASSERT_EQ(0, rados_striper_setxattr(striper, "RmXattr", "attr1", attr1_buf, sizeof(attr1_buf)));
318 ASSERT_EQ(0, rados_striper_rmxattr(striper, "RmXattr", "attr1"));
319 ASSERT_EQ(-ENODATA, rados_striper_getxattr(striper, "RmXattr", "attr1", buf, sizeof(buf)));
320 }
321
322 TEST_F(StriperTestPP, RmXattrPP) {
323 char buf[128];
324 memset(buf, 0xaa, sizeof(buf));
325 bufferlist bl1;
326 bl1.append(buf, sizeof(buf));
327 ASSERT_EQ(0, striper.write("RmXattrPP", bl1, sizeof(buf), 0));
328 char attr1_buf[] = "foo bar baz";
329 bufferlist bl2;
330 bl2.append(attr1_buf, sizeof(attr1_buf));
331 ASSERT_EQ(0, striper.setxattr("RmXattrPP", "attr1", bl2));
332 ASSERT_EQ(0, striper.rmxattr("RmXattrPP", "attr1"));
333 bufferlist bl3;
334 ASSERT_EQ(-ENODATA, striper.getxattr("RmXattrPP", "attr1", bl3));
335 }
336
337 TEST_F(StriperTest, XattrIter) {
338 char buf[128];
339 char attr1_buf[] = "foo bar baz";
340 char attr2_buf[256];
341 for (size_t j = 0; j < sizeof(attr2_buf); ++j) {
342 attr2_buf[j] = j % 0xff;
343 }
344 memset(buf, 0xaa, sizeof(buf));
345 ASSERT_EQ(0, rados_striper_write(striper, "RmXattr", buf, sizeof(buf), 0));
346 ASSERT_EQ(0, rados_striper_setxattr(striper, "RmXattr", "attr1", attr1_buf, sizeof(attr1_buf)));
347 ASSERT_EQ(0, rados_striper_setxattr(striper, "RmXattr", "attr2", attr2_buf, sizeof(attr2_buf)));
348 rados_xattrs_iter_t iter;
349 ASSERT_EQ(0, rados_striper_getxattrs(striper, "RmXattr", &iter));
350 int num_seen = 0;
351 while (true) {
352 const char *name;
353 const char *val;
354 size_t len;
355 ASSERT_EQ(0, rados_striper_getxattrs_next(iter, &name, &val, &len));
356 if (name == NULL) {
357 break;
358 }
359 ASSERT_LT(num_seen, 2) << "Extra attribute : " << name;
360 if ((strcmp(name, "attr1") == 0) && (val != NULL) && (memcmp(val, attr1_buf, len) == 0)) {
361 num_seen++;
362 continue;
363 }
364 else if ((strcmp(name, "attr2") == 0) && (val != NULL) && (memcmp(val, attr2_buf, len) == 0)) {
365 num_seen++;
366 continue;
367 }
368 else {
369 ASSERT_EQ(0, 1) << "Unexpected attribute : " << name;;
370 }
371 }
372 rados_striper_getxattrs_end(iter);
373 }
374
375 TEST_F(StriperTestPP, XattrListPP) {
376 char buf[128];
377 memset(buf, 0xaa, sizeof(buf));
378 bufferlist bl1;
379 bl1.append(buf, sizeof(buf));
380 ASSERT_EQ(0, striper.write("RmXattrPP", bl1, sizeof(buf), 0));
381 char attr1_buf[] = "foo bar baz";
382 bufferlist bl2;
383 bl2.append(attr1_buf, sizeof(attr1_buf));
384 ASSERT_EQ(0, striper.setxattr("RmXattrPP", "attr1", bl2));
385 char attr2_buf[256];
386 for (size_t j = 0; j < sizeof(attr2_buf); ++j) {
387 attr2_buf[j] = j % 0xff;
388 }
389 bufferlist bl3;
390 bl3.append(attr2_buf, sizeof(attr2_buf));
391 ASSERT_EQ(0, striper.setxattr("RmXattrPP", "attr2", bl3));
392 std::map<std::string, bufferlist> attrset;
393 ASSERT_EQ(0, striper.getxattrs("RmXattrPP", attrset));
394 for (std::map<std::string, bufferlist>::iterator i = attrset.begin();
395 i != attrset.end(); ++i) {
396 if (i->first == string("attr1")) {
397 ASSERT_EQ(0, memcmp(i->second.c_str(), attr1_buf, sizeof(attr1_buf)));
398 }
399 else if (i->first == string("attr2")) {
400 ASSERT_EQ(0, memcmp(i->second.c_str(), attr2_buf, sizeof(attr2_buf)));
401 }
402 else {
403 ASSERT_EQ(0, 1) << "Unexpected attribute : " << i->first;
404 }
405 }
406 }