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"
8 #include <boost/scoped_ptr.hpp>
10 #include <semaphore.h>
13 using namespace librados
;
14 using namespace libradosstriper
;
20 AioTestData() : m_complete(false) {
21 sem_init(&m_sem
, 0, 0);
42 void set_completion_complete(rados_completion_t cb
, void *arg
)
44 AioTestData
*test
= static_cast<AioTestData
*>(arg
);
45 test
->m_complete
= true;
49 TEST_F(StriperTest
, SimpleWrite
) {
50 AioTestData test_data
;
51 rados_completion_t my_completion
;
52 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
53 set_completion_complete
,
56 memset(buf
, 0xcc, sizeof(buf
));
57 ASSERT_EQ(0, rados_striper_aio_write(striper
, "StriperTest", my_completion
, buf
, sizeof(buf
), 0));
60 rados_aio_release(my_completion
);
63 TEST_F(StriperTestPP
, SimpleWritePP
) {
64 AioTestData test_data
;
65 AioCompletion
*my_completion
= librados::Rados::aio_create_completion
66 ((void*)&test_data
, set_completion_complete
);
68 memset(buf
, 0xcc, sizeof(buf
));
70 bl1
.append(buf
, sizeof(buf
));
71 ASSERT_EQ(0, striper
.aio_write("SimpleWritePP", my_completion
, bl1
, sizeof(buf
), 0));
74 my_completion
->release();
77 TEST_F(StriperTest
, WaitForSafe
) {
78 AioTestData test_data
;
79 rados_completion_t my_completion
;
80 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
81 set_completion_complete
,
84 memset(buf
, 0xcc, sizeof(buf
));
85 ASSERT_EQ(0, rados_striper_aio_write(striper
, "WaitForSafe", my_completion
, buf
, sizeof(buf
), 0));
87 rados_aio_wait_for_complete(my_completion
);
89 rados_aio_release(my_completion
);
92 TEST_F(StriperTestPP
, WaitForSafePP
) {
93 AioTestData test_data
;
94 AioCompletion
*my_completion
=
95 librados::Rados::aio_create_completion(&test_data
,
96 set_completion_complete
);
98 memset(buf
, 0xcc, sizeof(buf
));
100 bl1
.append(buf
, sizeof(buf
));
101 ASSERT_EQ(0, striper
.aio_write("WaitForSafePP", my_completion
, bl1
, sizeof(buf
), 0));
103 my_completion
->wait_for_complete();
105 my_completion
->release();
108 TEST_F(StriperTest
, RoundTrip
) {
109 AioTestData test_data
;
110 rados_completion_t my_completion
;
111 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
112 set_completion_complete
,
115 memset(buf
, 0xcc, sizeof(buf
));
116 ASSERT_EQ(0, rados_striper_aio_write(striper
, "RoundTrip", my_completion
, buf
, sizeof(buf
), 0));
122 memset(buf2
, 0, sizeof(buf2
));
123 rados_completion_t my_completion2
;
124 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
125 set_completion_complete
,
127 ASSERT_EQ(0, rados_striper_aio_read(striper
, "RoundTrip", my_completion2
, buf2
, sizeof(buf2
), 0));
130 rados_aio_wait_for_complete(my_completion2
);
132 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
134 rados_aio_release(my_completion
);
135 rados_aio_release(my_completion2
);
138 TEST_F(StriperTest
, RoundTrip2
) {
139 AioTestData test_data
;
140 rados_completion_t my_completion
;
141 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
142 set_completion_complete
,
145 memset(buf
, 0xcc, sizeof(buf
));
146 ASSERT_EQ(0, rados_striper_aio_write(striper
, "RoundTrip2", my_completion
, buf
, sizeof(buf
), 0));
152 memset(buf2
, 0, sizeof(buf2
));
153 rados_completion_t my_completion2
;
154 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
155 set_completion_complete
,
157 ASSERT_EQ(0, rados_striper_aio_read(striper
, "RoundTrip2", my_completion2
, buf2
, sizeof(buf2
), 0));
160 rados_aio_wait_for_complete(my_completion2
);
162 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
164 rados_aio_release(my_completion
);
165 rados_aio_release(my_completion2
);
168 TEST_F(StriperTestPP
, RoundTripPP
) {
169 AioTestData test_data
;
170 AioCompletion
*my_completion
=
171 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
173 memset(buf
, 0xcc, sizeof(buf
));
175 bl1
.append(buf
, sizeof(buf
));
176 ASSERT_EQ(0, striper
.aio_write("RoundTripPP", my_completion
, bl1
, sizeof(buf
), 0));
182 AioCompletion
*my_completion2
=
183 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
184 ASSERT_EQ(0, striper
.aio_read("RoundTripPP", my_completion2
, &bl2
, sizeof(buf
), 0));
187 my_completion2
->wait_for_complete();
189 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
191 my_completion
->release();
192 my_completion2
->release();
195 TEST_F(StriperTestPP
, RoundTripPP2
) {
196 AioTestData test_data
;
197 AioCompletion
*my_completion
=
198 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
200 memset(buf
, 0xcc, sizeof(buf
));
202 bl1
.append(buf
, sizeof(buf
));
203 ASSERT_EQ(0, striper
.aio_write("RoundTripPP2", my_completion
, bl1
, sizeof(buf
), 0));
209 AioCompletion
*my_completion2
=
210 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
211 ASSERT_EQ(0, striper
.aio_read("RoundTripPP2", my_completion2
, &bl2
, sizeof(buf
), 0));
214 my_completion2
->wait_for_complete();
216 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
218 my_completion
->release();
219 my_completion2
->release();
222 TEST_F(StriperTest
, IsComplete
) {
223 AioTestData test_data
;
224 rados_completion_t my_completion
;
225 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
226 set_completion_complete
,
229 memset(buf
, 0xcc, sizeof(buf
));
230 ASSERT_EQ(0, rados_striper_aio_write(striper
, "IsComplete", my_completion
, buf
, sizeof(buf
), 0));
236 memset(buf2
, 0, sizeof(buf2
));
237 rados_completion_t my_completion2
;
238 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
239 set_completion_complete
,
241 ASSERT_EQ(0, rados_striper_aio_read(striper
, "IsComplete", my_completion2
, buf2
, sizeof(buf2
), 0));
244 // Busy-wait until the AIO completes.
245 // Normally we wouldn't do this, but we want to test rados_aio_is_complete.
247 int is_complete
= rados_aio_is_complete(my_completion2
);
252 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
254 rados_aio_release(my_completion
);
255 rados_aio_release(my_completion2
);
258 TEST_F(StriperTestPP
, IsCompletePP
) {
259 AioTestData test_data
;
260 AioCompletion
*my_completion
=
261 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
263 memset(buf
, 0xcc, sizeof(buf
));
265 bl1
.append(buf
, sizeof(buf
));
266 ASSERT_EQ(0, striper
.aio_write("IsCompletePP", my_completion
, bl1
, sizeof(buf
), 0));
272 AioCompletion
*my_completion2
=
273 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
274 ASSERT_EQ(0, striper
.aio_read("IsCompletePP", my_completion2
, &bl2
, sizeof(buf
), 0));
277 // Busy-wait until the AIO completes.
278 // Normally we wouldn't do this, but we want to test rados_aio_is_complete.
280 int is_complete
= my_completion2
->is_complete();
285 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
287 my_completion
->release();
288 my_completion2
->release();
291 TEST_F(StriperTest
, IsSafe
) {
292 AioTestData test_data
;
293 rados_completion_t my_completion
;
294 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
295 set_completion_complete
,
298 memset(buf
, 0xcc, sizeof(buf
));
299 ASSERT_EQ(0, rados_striper_aio_write(striper
, "IsSafe", my_completion
, buf
, sizeof(buf
), 0));
302 // Busy-wait until the AIO completes.
303 // Normally we wouldn't do this, but we want to test rados_aio_is_safe.
305 int is_safe
= rados_aio_is_safe(my_completion
);
311 memset(buf2
, 0, sizeof(buf2
));
312 rados_completion_t my_completion2
;
313 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
314 set_completion_complete
,
316 ASSERT_EQ(0, rados_striper_aio_read(striper
, "IsSafe", my_completion2
, buf2
, sizeof(buf2
), 0));
319 rados_aio_wait_for_complete(my_completion2
);
321 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
323 rados_aio_release(my_completion
);
324 rados_aio_release(my_completion2
);
327 TEST_F(StriperTest
, RoundTripAppend
) {
328 AioTestData test_data
;
329 rados_completion_t my_completion
, my_completion2
, my_completion3
;
330 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
331 set_completion_complete
,
334 memset(buf
, 0xcc, sizeof(buf
));
335 ASSERT_EQ(0, rados_striper_aio_append(striper
, "RoundTripAppend", my_completion
, buf
, sizeof(buf
)));
338 rados_aio_wait_for_complete(my_completion
);
341 memset(buf2
, 0xdd, sizeof(buf2
));
342 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
343 set_completion_complete
,
345 ASSERT_EQ(0, rados_striper_aio_append(striper
, "RoundTripAppend", my_completion2
, buf2
, sizeof(buf
)));
348 rados_aio_wait_for_complete(my_completion2
);
350 char buf3
[sizeof(buf
) + sizeof(buf2
)];
351 memset(buf3
, 0, sizeof(buf3
));
352 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
353 set_completion_complete
,
355 ASSERT_EQ(0, rados_striper_aio_read(striper
, "RoundTripAppend", my_completion3
, buf3
, sizeof(buf3
), 0));
358 rados_aio_wait_for_complete(my_completion3
);
360 ASSERT_EQ((int)(sizeof(buf
) + sizeof(buf2
)), rados_aio_get_return_value(my_completion3
));
361 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
362 ASSERT_EQ(0, memcmp(buf3
+ sizeof(buf
), buf2
, sizeof(buf2
)));
364 rados_aio_release(my_completion
);
365 rados_aio_release(my_completion2
);
366 rados_aio_release(my_completion3
);
369 TEST_F(StriperTestPP
, RoundTripAppendPP
) {
370 AioTestData test_data
;
371 AioCompletion
*my_completion
=
372 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
374 memset(buf
, 0xcc, sizeof(buf
));
376 bl1
.append(buf
, sizeof(buf
));
377 ASSERT_EQ(0, striper
.aio_append("RoundTripAppendPP", my_completion
, bl1
, sizeof(buf
)));
380 my_completion
->wait_for_complete();
383 memset(buf2
, 0xdd, sizeof(buf2
));
385 bl2
.append(buf2
, sizeof(buf2
));
386 AioCompletion
*my_completion2
=
387 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
388 ASSERT_EQ(0, striper
.aio_append("RoundTripAppendPP", my_completion2
, bl2
, sizeof(buf2
)));
391 my_completion2
->wait_for_complete();
394 AioCompletion
*my_completion3
=
395 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
396 ASSERT_EQ(0, striper
.aio_read("RoundTripAppendPP", my_completion3
, &bl3
, 2 * sizeof(buf
), 0));
399 my_completion3
->wait_for_complete();
401 ASSERT_EQ(sizeof(buf
) + sizeof(buf2
), (unsigned)my_completion3
->get_return_value());
402 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf
, sizeof(buf
)));
403 ASSERT_EQ(0, memcmp(bl3
.c_str() + sizeof(buf
), buf2
, sizeof(buf2
)));
405 my_completion
->release();
406 my_completion2
->release();
407 my_completion3
->release();
410 TEST_F(StriperTest
, Flush
) {
411 AioTestData test_data
;
412 rados_completion_t my_completion
;
413 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
414 set_completion_complete
,
417 memset(buf
, 0xee, sizeof(buf
));
418 ASSERT_EQ(0, rados_striper_aio_write(striper
, "Flush", my_completion
, buf
, sizeof(buf
), 0));
419 rados_striper_aio_flush(striper
);
421 memset(buf2
, 0, sizeof(buf2
));
422 rados_completion_t my_completion2
;
423 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
424 set_completion_complete
,
426 ASSERT_EQ(0, rados_striper_aio_read(striper
, "Flush", my_completion2
, buf2
, sizeof(buf2
), 0));
429 rados_aio_wait_for_complete(my_completion2
);
431 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
433 rados_aio_release(my_completion
);
434 rados_aio_release(my_completion2
);
437 TEST_F(StriperTestPP
, FlushPP
) {
438 AioTestData test_data
;
439 AioCompletion
*my_completion
=
440 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
442 memset(buf
, 0xee, sizeof(buf
));
444 bl1
.append(buf
, sizeof(buf
));
445 ASSERT_EQ(0, striper
.aio_write("FlushPP", my_completion
, bl1
, sizeof(buf
), 0));
448 AioCompletion
*my_completion2
=
449 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
450 ASSERT_EQ(0, striper
.aio_read("FlushPP", my_completion2
, &bl2
, sizeof(buf
), 0));
453 my_completion2
->wait_for_complete();
455 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
457 my_completion
->release();
458 my_completion2
->release();
461 TEST_F(StriperTest
, RoundTripWriteFull
) {
462 AioTestData test_data
;
463 rados_completion_t my_completion
, my_completion2
, my_completion3
;
464 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
465 set_completion_complete
,
468 memset(buf
, 0xcc, sizeof(buf
));
469 ASSERT_EQ(0, rados_striper_aio_write(striper
, "RoundTripWriteFull", my_completion
, buf
, sizeof(buf
), 0));
472 rados_aio_wait_for_complete(my_completion
);
475 memset(buf2
, 0xdd, sizeof(buf2
));
476 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
477 set_completion_complete
,
479 ASSERT_EQ(0, rados_striper_aio_write_full(striper
, "RoundTripWriteFull", my_completion2
, buf2
, sizeof(buf2
)));
482 rados_aio_wait_for_complete(my_completion2
);
484 char buf3
[sizeof(buf
) + sizeof(buf2
)];
485 memset(buf3
, 0, sizeof(buf3
));
486 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
487 set_completion_complete
,
489 ASSERT_EQ(0, rados_striper_aio_read(striper
, "RoundTripWriteFull", my_completion3
, buf3
, sizeof(buf3
), 0));
492 rados_aio_wait_for_complete(my_completion3
);
494 ASSERT_EQ(sizeof(buf2
), (unsigned)rados_aio_get_return_value(my_completion3
));
495 ASSERT_EQ(0, memcmp(buf3
, buf2
, sizeof(buf2
)));
497 rados_aio_release(my_completion
);
498 rados_aio_release(my_completion2
);
499 rados_aio_release(my_completion3
);
502 TEST_F(StriperTestPP
, RoundTripWriteFullPP
) {
503 AioTestData test_data
;
504 AioCompletion
*my_completion
=
505 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
507 memset(buf
, 0xcc, sizeof(buf
));
509 bl1
.append(buf
, sizeof(buf
));
510 ASSERT_EQ(0, striper
.aio_write("RoundTripWriteFullPP", my_completion
, bl1
, sizeof(buf
), 0));
513 my_completion
->wait_for_complete();
516 memset(buf2
, 0xdd, sizeof(buf2
));
518 bl2
.append(buf2
, sizeof(buf2
));
519 AioCompletion
*my_completion2
=
520 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
521 ASSERT_EQ(0, striper
.aio_write_full("RoundTripWriteFullPP", my_completion2
, bl2
));
524 my_completion2
->wait_for_complete();
527 AioCompletion
*my_completion3
=
528 librados::Rados::aio_create_completion(&test_data
, set_completion_complete
);
529 ASSERT_EQ(0, striper
.aio_read("RoundTripWriteFullPP", my_completion3
, &bl3
, sizeof(buf
), 0));
532 my_completion3
->wait_for_complete();
534 ASSERT_EQ(sizeof(buf2
), (unsigned)my_completion3
->get_return_value());
535 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf2
, sizeof(buf2
)));
537 my_completion
->release();
538 my_completion2
->release();
539 my_completion3
->release();
542 TEST_F(StriperTest
, RemoveTest
) {
544 char buf2
[sizeof(buf
)];
546 memset(buf
, 0xaa, sizeof(buf
));
547 ASSERT_EQ(0, rados_striper_write(striper
, "RemoveTest", buf
, sizeof(buf
), 0));
549 AioTestData test_data
;
550 rados_completion_t my_completion
;
551 ASSERT_EQ(0, rados_aio_create_completion2(&test_data
,
552 set_completion_complete
,
554 ASSERT_EQ(0, rados_striper_aio_remove(striper
, "RemoveTest", my_completion
));
557 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
559 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
560 rados_aio_release(my_completion
);
561 // check we get ENOENT on reading
562 ASSERT_EQ(-ENOENT
, rados_striper_read(striper
, "RemoveTest", buf2
, sizeof(buf2
), 0));
565 TEST_F(StriperTestPP
, RemoveTestPP
) {
567 memset(buf
, 0xaa, sizeof(buf
));
569 bl
.append(buf
, sizeof(buf
));
570 ASSERT_EQ(0, striper
.write("RemoveTestPP", bl
, sizeof(buf
), 0));
571 AioCompletion
*my_completion
= cluster
.aio_create_completion(nullptr, nullptr);
572 ASSERT_EQ(0, striper
.aio_remove("RemoveTestPP", my_completion
));
575 ASSERT_EQ(0, my_completion
->wait_for_complete());
577 ASSERT_EQ(0, my_completion
->get_return_value());
579 ASSERT_EQ(-ENOENT
, striper
.read("RemoveTestPP", &bl2
, sizeof(buf
), 0));
580 my_completion
->release();