1 #include "common/errno.h"
2 #include "include/err.h"
3 #include "include/rados/librados.h"
4 #include "test/librados/test.h"
5 #include "include/types.h"
6 #include "include/stringify.h"
8 #include "gtest/gtest.h"
13 #include <boost/scoped_ptr.hpp>
16 using std::ostringstream
;
17 using namespace librados
;
33 rados_ioctx_destroy(m_ioctx
);
34 destroy_one_pool(m_pool_name
, &m_cluster
);
41 m_pool_name
= get_temp_pool_name();
42 std::string err
= create_one_pool(m_pool_name
, &m_cluster
);
45 oss
<< "create_one_pool(" << m_pool_name
<< ") failed: error " << err
;
48 ret
= rados_ioctx_create(m_cluster
, m_pool_name
.c_str(), &m_ioctx
);
50 destroy_one_pool(m_pool_name
, &m_cluster
);
52 oss
<< "rados_ioctx_create failed: error " << ret
;
60 rados_ioctx_t m_ioctx
;
61 std::string m_pool_name
;
77 destroy_one_pool_pp(m_pool_name
, m_cluster
);
86 std::string
init(const std::map
<std::string
, std::string
> &config
)
90 m_pool_name
= get_temp_pool_name();
91 std::string err
= create_one_pool_pp(m_pool_name
, m_cluster
, config
);
94 oss
<< "create_one_pool(" << m_pool_name
<< ") failed: error " << err
;
97 ret
= m_cluster
.ioctx_create(m_pool_name
.c_str(), m_ioctx
);
99 destroy_one_pool_pp(m_pool_name
, m_cluster
);
101 oss
<< "rados_ioctx_create failed: error " << ret
;
110 std::string m_pool_name
;
114 TEST(LibRadosAio
, TooBig
) {
115 AioTestData test_data
;
116 rados_completion_t my_completion
;
117 ASSERT_EQ("", test_data
.init());
118 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
119 nullptr, nullptr, &my_completion
));
121 memset(buf
, 0xcc, sizeof(buf
));
122 ASSERT_EQ(-E2BIG
, rados_aio_write(test_data
.m_ioctx
, "foo",
123 my_completion
, buf
, UINT_MAX
, 0));
124 ASSERT_EQ(-E2BIG
, rados_aio_write_full(test_data
.m_ioctx
, "foo",
125 my_completion
, buf
, UINT_MAX
));
126 ASSERT_EQ(-E2BIG
, rados_aio_append(test_data
.m_ioctx
, "foo",
127 my_completion
, buf
, UINT_MAX
));
128 rados_aio_release(my_completion
);
131 TEST(LibRadosAio
, TooBigPP
) {
132 AioTestDataPP test_data
;
133 ASSERT_EQ("", test_data
.init());
136 AioCompletion
*aio_completion
= test_data
.m_cluster
.aio_create_completion(
137 nullptr, NULL
, NULL
);
138 ASSERT_EQ(-E2BIG
, test_data
.m_ioctx
.aio_write("foo", aio_completion
, bl
, UINT_MAX
, 0));
139 ASSERT_EQ(-E2BIG
, test_data
.m_ioctx
.aio_append("foo", aio_completion
, bl
, UINT_MAX
));
140 // ioctx.aio_write_full no way to overflow bl.length()
141 delete aio_completion
;
144 TEST(LibRadosAio
, PoolQuotaPP
) {
145 AioTestDataPP test_data
;
146 ASSERT_EQ("", test_data
.init());
147 string p
= get_temp_pool_name();
148 ASSERT_EQ(0, test_data
.m_cluster
.pool_create(p
.c_str()));
150 ASSERT_EQ(0, test_data
.m_cluster
.ioctx_create(p
.c_str(), ioctx
));
151 ioctx
.application_enable("rados", true);
154 ASSERT_EQ(0, test_data
.m_cluster
.mon_command(
155 "{\"prefix\": \"osd pool set-quota\", \"pool\": \"" + p
+
156 "\", \"field\": \"max_bytes\", \"val\": \"4096\"}",
163 for (n
= 0; n
< 1024; ++n
) {
164 ObjectWriteOperation op
;
166 librados::AioCompletion
*completion
=
167 test_data
.m_cluster
.aio_create_completion();
168 ASSERT_EQ(0, ioctx
.aio_operate(
169 "foo" + stringify(n
), completion
, &op
,
170 librados::OPERATION_FULL_TRY
));
171 completion
->wait_for_safe();
172 int r
= completion
->get_return_value();
173 completion
->release();
181 // make sure we have latest map that marked the pool full
182 test_data
.m_cluster
.wait_for_latest_osdmap();
184 // make sure we block without FULL_TRY
186 ObjectWriteOperation op
;
188 librados::AioCompletion
*completion
=
189 test_data
.m_cluster
.aio_create_completion();
190 ASSERT_EQ(0, ioctx
.aio_operate("bar", completion
, &op
, 0));
192 ASSERT_FALSE(completion
->is_safe());
193 completion
->release();
197 ASSERT_EQ(0, test_data
.m_cluster
.pool_delete(p
.c_str()));
200 TEST(LibRadosAio
, SimpleWrite
) {
201 AioTestData test_data
;
202 rados_completion_t my_completion
;
203 ASSERT_EQ("", test_data
.init());
204 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
205 nullptr, nullptr, &my_completion
));
207 memset(buf
, 0xcc, sizeof(buf
));
208 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
209 my_completion
, buf
, sizeof(buf
), 0));
212 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
214 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
216 rados_ioctx_set_namespace(test_data
.m_ioctx
, "nspace");
217 rados_completion_t my_completion2
;
218 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
219 nullptr, nullptr, &my_completion2
));
220 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
221 my_completion2
, buf
, sizeof(buf
), 0));
224 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
226 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
227 rados_aio_release(my_completion
);
228 rados_aio_release(my_completion2
);
231 TEST(LibRadosAio
, SimpleWritePP
) {
233 memset(buf
, 0xcc, sizeof(buf
));
235 bl1
.append(buf
, sizeof(buf
));
237 AioTestDataPP test_data
;
238 ASSERT_EQ("", test_data
.init());
239 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
240 nullptr, nullptr, nullptr);
241 AioCompletion
*my_completion_null
= NULL
;
242 ASSERT_NE(my_completion
, my_completion_null
);
243 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo",
244 my_completion
, bl1
, sizeof(buf
), 0));
247 ASSERT_EQ(0, my_completion
->wait_for_complete());
249 ASSERT_EQ(0, my_completion
->get_return_value());
250 delete my_completion
;
254 AioTestDataPP test_data
;
255 ASSERT_EQ("", test_data
.init());
256 test_data
.m_ioctx
.set_namespace("nspace");
257 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
258 nullptr, nullptr, nullptr);
259 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo",
260 my_completion
, bl1
, sizeof(buf
), 0));
263 ASSERT_EQ(0, my_completion
->wait_for_complete());
265 ASSERT_EQ(0, my_completion
->get_return_value());
266 delete my_completion
;
270 TEST(LibRadosAio
, WaitForSafe
) {
271 AioTestData test_data
;
272 rados_completion_t my_completion
;
273 ASSERT_EQ("", test_data
.init());
274 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
275 nullptr, nullptr, &my_completion
));
277 memset(buf
, 0xcc, sizeof(buf
));
278 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
279 my_completion
, buf
, sizeof(buf
), 0));
281 ASSERT_EQ(0, rados_aio_wait_for_safe(my_completion
));
282 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
283 rados_aio_release(my_completion
);
286 TEST(LibRadosAio
, WaitForSafePP
) {
287 AioTestDataPP test_data
;
288 ASSERT_EQ("", test_data
.init());
289 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
290 nullptr, nullptr, nullptr);
291 AioCompletion
*my_completion_null
= NULL
;
292 ASSERT_NE(my_completion
, my_completion_null
);
294 memset(buf
, 0xcc, sizeof(buf
));
296 bl1
.append(buf
, sizeof(buf
));
297 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo",
298 my_completion
, bl1
, sizeof(buf
), 0));
300 ASSERT_EQ(0, my_completion
->wait_for_safe());
301 ASSERT_EQ(0, my_completion
->get_return_value());
302 delete my_completion
;
305 TEST(LibRadosAio
, RoundTrip
) {
306 AioTestData test_data
;
307 rados_completion_t my_completion
;
308 ASSERT_EQ("", test_data
.init());
309 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
310 nullptr, nullptr, &my_completion
));
312 memset(buf
, 0xcc, sizeof(buf
));
313 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
314 my_completion
, buf
, sizeof(buf
), 0));
317 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
319 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
321 memset(buf2
, 0, sizeof(buf2
));
322 rados_completion_t my_completion2
;
323 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
324 nullptr, nullptr, &my_completion2
));
325 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
326 my_completion2
, buf2
, sizeof(buf2
), 0));
329 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
331 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
332 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
333 rados_aio_release(my_completion
);
334 rados_aio_release(my_completion2
);
337 TEST(LibRadosAio
, RoundTrip2
) {
338 AioTestData test_data
;
339 rados_completion_t my_completion
;
340 ASSERT_EQ("", test_data
.init());
341 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
342 nullptr, nullptr, &my_completion
));
344 memset(buf
, 0xcc, sizeof(buf
));
345 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
346 my_completion
, buf
, sizeof(buf
), 0));
349 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
351 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
353 memset(buf2
, 0, sizeof(buf2
));
354 rados_completion_t my_completion2
;
355 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
356 nullptr, nullptr, &my_completion2
));
357 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
358 my_completion2
, buf2
, sizeof(buf2
), 0));
361 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
363 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
364 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
365 rados_aio_release(my_completion
);
366 rados_aio_release(my_completion2
);
369 TEST(LibRadosAio
, RoundTrip3
) {
370 AioTestData test_data
;
371 rados_completion_t my_completion
;
372 ASSERT_EQ("", test_data
.init());
373 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
374 nullptr, nullptr, &my_completion
));
376 memset(buf
, 0xcc, sizeof(buf
));
378 rados_write_op_t op1
= rados_create_write_op();
379 rados_write_op_write(op1
, buf
, sizeof(buf
), 0);
380 rados_write_op_set_alloc_hint2(op1
, 0, 0, LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
381 ASSERT_EQ(0, rados_aio_write_op_operate(op1
, test_data
.m_ioctx
, my_completion
,
383 rados_release_write_op(op1
);
387 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
390 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
391 rados_aio_release(my_completion
);
394 memset(buf2
, 0, sizeof(buf2
));
395 rados_completion_t my_completion2
;
396 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
397 nullptr, nullptr, &my_completion2
));
399 rados_read_op_t op2
= rados_create_read_op();
400 rados_read_op_read(op2
, 0, sizeof(buf2
), buf2
, NULL
, NULL
);
401 rados_read_op_set_flags(op2
, LIBRADOS_OP_FLAG_FADVISE_NOCACHE
|
402 LIBRADOS_OP_FLAG_FADVISE_RANDOM
);
403 __le32 init_value
= -1;
405 rados_read_op_checksum(op2
, LIBRADOS_CHECKSUM_TYPE_CRC32C
,
406 reinterpret_cast<char *>(&init_value
),
407 sizeof(init_value
), 0, 0, 0,
408 reinterpret_cast<char *>(&checksum
),
409 sizeof(checksum
), NULL
);
410 ASSERT_EQ(0, rados_aio_read_op_operate(op2
, test_data
.m_ioctx
, my_completion2
,
412 rados_release_read_op(op2
);
416 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
418 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
419 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
420 rados_aio_release(my_completion2
);
423 bl
.append(buf
, sizeof(buf
));
424 ASSERT_EQ(1U, checksum
[0]);
425 ASSERT_EQ(bl
.crc32c(-1), checksum
[1]);
428 TEST(LibRadosAio
, RoundTripPP
) {
429 AioTestDataPP test_data
;
430 ASSERT_EQ("", test_data
.init());
431 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
432 nullptr, nullptr, nullptr);
433 AioCompletion
*my_completion_null
= NULL
;
434 ASSERT_NE(my_completion
, my_completion_null
);
436 memset(buf
, 0xcc, sizeof(buf
));
438 bl1
.append(buf
, sizeof(buf
));
439 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
440 bl1
, sizeof(buf
), 0));
443 ASSERT_EQ(0, my_completion
->wait_for_complete());
445 ASSERT_EQ(0, my_completion
->get_return_value());
447 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
448 nullptr, nullptr, nullptr);
449 ASSERT_NE(my_completion2
, my_completion_null
);
450 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo",
451 my_completion2
, &bl2
, sizeof(buf
), 0));
454 ASSERT_EQ(0, my_completion2
->wait_for_complete());
456 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
457 ASSERT_EQ(sizeof(buf
), bl2
.length());
458 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
459 delete my_completion
;
460 delete my_completion2
;
463 TEST(LibRadosAio
, RoundTripPP2
) {
464 AioTestDataPP test_data
;
465 ASSERT_EQ("", test_data
.init());
466 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
467 nullptr, nullptr, nullptr);
468 AioCompletion
*my_completion_null
= NULL
;
469 ASSERT_NE(my_completion
, my_completion_null
);
471 memset(buf
, 0xcc, sizeof(buf
));
473 bl1
.append(buf
, sizeof(buf
));
474 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
475 bl1
, sizeof(buf
), 0));
478 ASSERT_EQ(0, my_completion
->wait_for_complete());
480 ASSERT_EQ(0, my_completion
->get_return_value());
482 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
483 nullptr, nullptr, nullptr);
484 ASSERT_NE(my_completion2
, my_completion_null
);
485 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo",
486 my_completion2
, &bl2
, sizeof(buf
), 0));
489 ASSERT_EQ(0, my_completion2
->wait_for_safe());
490 ASSERT_EQ(0, my_completion2
->wait_for_complete());
492 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
493 ASSERT_EQ(sizeof(buf
), bl2
.length());
494 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
495 delete my_completion
;
496 delete my_completion2
;
499 //using ObjectWriteOperation/ObjectReadOperation with iohint
500 TEST(LibRadosAio
, RoundTripPP3
)
503 std::string pool_name
= get_temp_pool_name();
504 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
506 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
508 boost::scoped_ptr
<AioCompletion
> my_completion1(cluster
.aio_create_completion(0, 0, 0));
509 ObjectWriteOperation op
;
511 memset(buf
, 0xcc, sizeof(buf
));
513 bl
.append(buf
, sizeof(buf
));
516 op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
517 ioctx
.aio_operate("test_obj", my_completion1
.get(), &op
);
520 ASSERT_EQ(0, my_completion1
->wait_for_complete());
522 EXPECT_EQ(0, my_completion1
->get_return_value());
524 boost::scoped_ptr
<AioCompletion
> my_completion2(cluster
.aio_create_completion(0, 0, 0));
526 ObjectReadOperation op1
;
527 op1
.read(0, sizeof(buf
), &bl
, NULL
);
528 op1
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
|LIBRADOS_OP_FLAG_FADVISE_RANDOM
);
529 bufferlist init_value_bl
;
530 ::encode(static_cast<int32_t>(-1), init_value_bl
);
532 op1
.checksum(LIBRADOS_CHECKSUM_TYPE_CRC32C
, init_value_bl
,
533 0, 0, 0, &csum_bl
, nullptr);
534 ioctx
.aio_operate("test_obj", my_completion2
.get(), &op1
, 0);
537 ASSERT_EQ(0, my_completion2
->wait_for_complete());
539 EXPECT_EQ(0, my_completion2
->get_return_value());
540 ASSERT_EQ(0, memcmp(buf
, bl
.c_str(), sizeof(buf
)));
542 ASSERT_EQ(8U, csum_bl
.length());
543 auto csum_bl_it
= csum_bl
.begin();
546 ::decode(csum_count
, csum_bl_it
);
547 ASSERT_EQ(1U, csum_count
);
548 ::decode(csum
, csum_bl_it
);
549 ASSERT_EQ(bl
.crc32c(-1), csum
);
550 ioctx
.remove("test_obj");
551 destroy_one_pool_pp(pool_name
, cluster
);
554 TEST(LibRadosAio
, RoundTripSparseReadPP
) {
555 AioTestDataPP test_data
;
556 ASSERT_EQ("", test_data
.init());
557 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
558 nullptr, nullptr, nullptr);
559 AioCompletion
*my_completion_null
= NULL
;
560 ASSERT_NE(my_completion
, my_completion_null
);
562 memset(buf
, 0xcc, sizeof(buf
));
564 bl1
.append(buf
, sizeof(buf
));
565 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
566 bl1
, sizeof(buf
), 0));
569 ASSERT_EQ(0, my_completion
->wait_for_complete());
571 ASSERT_EQ(0, my_completion
->get_return_value());
572 std::map
<uint64_t, uint64_t> extents
;
574 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
575 nullptr, nullptr, nullptr);
576 ASSERT_NE(my_completion2
, my_completion_null
);
577 ASSERT_EQ(0, test_data
.m_ioctx
.aio_sparse_read("foo",
578 my_completion2
, &extents
, &bl2
, sizeof(buf
), 0));
581 ASSERT_EQ(0, my_completion2
->wait_for_complete());
583 ASSERT_EQ(0, my_completion2
->get_return_value());
584 assert_eq_sparse(bl1
, extents
, bl2
);
585 delete my_completion
;
586 delete my_completion2
;
589 TEST(LibRadosAio
, RoundTripAppend
) {
590 AioTestData test_data
;
591 rados_completion_t my_completion
, my_completion2
, my_completion3
;
592 ASSERT_EQ("", test_data
.init());
593 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
594 nullptr, nullptr, &my_completion
));
596 memset(buf
, 0xcc, sizeof(buf
));
597 ASSERT_EQ(0, rados_aio_append(test_data
.m_ioctx
, "foo",
598 my_completion
, buf
, sizeof(buf
)));
601 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
603 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
605 memset(buf2
, 0xdd, sizeof(buf2
));
606 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
607 nullptr, nullptr, &my_completion2
));
608 ASSERT_EQ(0, rados_aio_append(test_data
.m_ioctx
, "foo",
609 my_completion2
, buf2
, sizeof(buf2
)));
612 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
614 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
615 char buf3
[sizeof(buf
) + sizeof(buf2
)];
616 memset(buf3
, 0, sizeof(buf3
));
617 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
618 nullptr, nullptr, &my_completion3
));
619 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
620 my_completion3
, buf3
, sizeof(buf3
), 0));
623 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
625 ASSERT_EQ((int)sizeof(buf3
), rados_aio_get_return_value(my_completion3
));
626 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
627 ASSERT_EQ(0, memcmp(buf3
+ sizeof(buf
), buf2
, sizeof(buf2
)));
628 rados_aio_release(my_completion
);
629 rados_aio_release(my_completion2
);
630 rados_aio_release(my_completion3
);
633 TEST(LibRadosAio
, RoundTripAppendPP
) {
634 AioTestDataPP test_data
;
635 ASSERT_EQ("", test_data
.init());
636 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
637 nullptr, nullptr, nullptr);
638 AioCompletion
*my_completion_null
= NULL
;
639 ASSERT_NE(my_completion
, my_completion_null
);
641 memset(buf
, 0xcc, sizeof(buf
));
643 bl1
.append(buf
, sizeof(buf
));
644 ASSERT_EQ(0, test_data
.m_ioctx
.aio_append("foo", my_completion
,
648 ASSERT_EQ(0, my_completion
->wait_for_complete());
650 ASSERT_EQ(0, my_completion
->get_return_value());
652 memset(buf2
, 0xdd, sizeof(buf2
));
654 bl2
.append(buf2
, sizeof(buf2
));
655 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
656 nullptr, nullptr, nullptr);
657 ASSERT_NE(my_completion2
, my_completion_null
);
658 ASSERT_EQ(0, test_data
.m_ioctx
.aio_append("foo", my_completion2
,
662 ASSERT_EQ(0, my_completion2
->wait_for_complete());
664 ASSERT_EQ(0, my_completion2
->get_return_value());
666 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
667 nullptr, nullptr, nullptr);
668 ASSERT_NE(my_completion3
, my_completion_null
);
669 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo",
670 my_completion3
, &bl3
, 2 * sizeof(buf
), 0));
673 ASSERT_EQ(0, my_completion3
->wait_for_complete());
675 ASSERT_EQ((int)(sizeof(buf
) * 2), my_completion3
->get_return_value());
676 ASSERT_EQ(sizeof(buf
) * 2, bl3
.length());
677 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf
, sizeof(buf
)));
678 ASSERT_EQ(0, memcmp(bl3
.c_str() + sizeof(buf
), buf2
, sizeof(buf2
)));
679 delete my_completion
;
680 delete my_completion2
;
681 delete my_completion3
;
684 TEST(LibRadosAio
, RemoveTest
) {
686 char buf2
[sizeof(buf
)];
687 rados_completion_t my_completion
;
688 AioTestData test_data
;
689 ASSERT_EQ("", test_data
.init());
690 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
691 nullptr, nullptr, &my_completion
));
692 memset(buf
, 0xaa, sizeof(buf
));
693 ASSERT_EQ(0, rados_append(test_data
.m_ioctx
, "foo", buf
, sizeof(buf
)));
694 ASSERT_EQ(0, rados_aio_remove(test_data
.m_ioctx
, "foo", my_completion
));
697 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
699 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
700 memset(buf2
, 0, sizeof(buf2
));
701 ASSERT_EQ(-ENOENT
, rados_read(test_data
.m_ioctx
, "foo", buf2
, sizeof(buf2
), 0));
702 rados_aio_release(my_completion
);
705 TEST(LibRadosAioPP
, RemoveTestPP
) {
707 memset(buf
, 0xaa, sizeof(buf
));
709 bl1
.append(buf
, sizeof(buf
));
710 AioTestDataPP test_data
;
711 ASSERT_EQ("", test_data
.init());
712 ASSERT_EQ(0, test_data
.m_ioctx
.append("foo", bl1
, sizeof(buf
)));
713 boost::scoped_ptr
<AioCompletion
> my_completion
714 (test_data
.m_cluster
.aio_create_completion
715 (nullptr, nullptr, nullptr));
716 ASSERT_EQ(0, test_data
.m_ioctx
.aio_remove("foo", my_completion
.get()));
719 ASSERT_EQ(0, my_completion
->wait_for_complete());
721 ASSERT_EQ(0, my_completion
->get_return_value());
723 ASSERT_EQ(-ENOENT
, test_data
.m_ioctx
.read("foo", bl2
, sizeof(buf
), 0));
726 TEST(LibRadosAio
, XattrsRoundTrip
) {
728 char attr1
[] = "attr1";
729 char attr1_buf
[] = "foo bar baz";
731 AioTestData test_data
;
732 ASSERT_EQ("", test_data
.init());
733 memset(buf
, 0xaa, sizeof(buf
));
734 ASSERT_EQ(0, rados_append(test_data
.m_ioctx
, "foo", buf
, sizeof(buf
)));
736 rados_completion_t my_completion
;
737 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
738 nullptr, nullptr, &my_completion
));
739 ASSERT_EQ(0, rados_aio_getxattr(test_data
.m_ioctx
, "foo", my_completion
, attr1
, buf
, sizeof(buf
)));
742 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
744 ASSERT_EQ(-ENODATA
, rados_aio_get_return_value(my_completion
));
745 rados_aio_release(my_completion
);
747 rados_completion_t my_completion2
;
748 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
749 nullptr, nullptr, &my_completion2
));
750 ASSERT_EQ(0, rados_aio_setxattr(test_data
.m_ioctx
, "foo", my_completion2
, attr1
, attr1_buf
, sizeof(attr1_buf
)));
753 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
755 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
756 rados_aio_release(my_completion2
);
758 rados_completion_t my_completion3
;
759 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
760 nullptr, nullptr, &my_completion3
));
761 ASSERT_EQ(0, rados_aio_getxattr(test_data
.m_ioctx
, "foo", my_completion3
, attr1
, buf
, sizeof(buf
)));
764 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
766 ASSERT_EQ((int)sizeof(attr1_buf
), rados_aio_get_return_value(my_completion3
));
767 rados_aio_release(my_completion3
);
768 // check content of attribute
769 ASSERT_EQ(0, memcmp(attr1_buf
, buf
, sizeof(attr1_buf
)));
772 TEST(LibRadosAioPP
, XattrsRoundTripPP
) {
774 char attr1
[] = "attr1";
775 char attr1_buf
[] = "foo bar baz";
776 memset(buf
, 0xaa, sizeof(buf
));
778 bl1
.append(buf
, sizeof(buf
));
779 AioTestDataPP test_data
;
780 ASSERT_EQ("", test_data
.init());
781 ASSERT_EQ(0, test_data
.m_ioctx
.append("foo", bl1
, sizeof(buf
)));
784 boost::scoped_ptr
<AioCompletion
> my_completion
785 (test_data
.m_cluster
.aio_create_completion
786 (nullptr, nullptr, nullptr));
787 ASSERT_EQ(0, test_data
.m_ioctx
.aio_getxattr("foo", my_completion
.get(), attr1
, bl2
));
790 ASSERT_EQ(0, my_completion
->wait_for_complete());
792 ASSERT_EQ(-ENODATA
, my_completion
->get_return_value());
795 bl3
.append(attr1_buf
, sizeof(attr1_buf
));
797 AioTestDataPP test_data2
;
798 ASSERT_EQ("", test_data2
.init());
799 boost::scoped_ptr
<AioCompletion
> my_completion2
800 (test_data
.m_cluster
.aio_create_completion
801 (nullptr, nullptr, nullptr));
802 ASSERT_EQ(0, test_data
.m_ioctx
.aio_setxattr("foo", my_completion2
.get(), attr1
, bl3
));
805 ASSERT_EQ(0, my_completion2
->wait_for_complete());
807 ASSERT_EQ(0, my_completion2
->get_return_value());
810 AioTestDataPP test_data3
;
811 ASSERT_EQ("", test_data3
.init());
812 boost::scoped_ptr
<AioCompletion
> my_completion3
813 (test_data
.m_cluster
.aio_create_completion
814 (nullptr, nullptr, nullptr));
815 ASSERT_EQ(0, test_data
.m_ioctx
.aio_getxattr("foo", my_completion3
.get(), attr1
, bl4
));
818 ASSERT_EQ(0, my_completion3
->wait_for_complete());
820 ASSERT_EQ((int)sizeof(attr1_buf
), my_completion3
->get_return_value());
821 // check content of attribute
822 ASSERT_EQ(0, memcmp(bl4
.c_str(), attr1_buf
, sizeof(attr1_buf
)));
825 TEST(LibRadosAio
, RmXattr
) {
827 char attr1
[] = "attr1";
828 char attr1_buf
[] = "foo bar baz";
830 memset(buf
, 0xaa, sizeof(buf
));
831 AioTestData test_data
;
832 ASSERT_EQ("", test_data
.init());
833 ASSERT_EQ(0, rados_append(test_data
.m_ioctx
, "foo", buf
, sizeof(buf
)));
835 rados_completion_t my_completion
;
836 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
837 nullptr, nullptr, &my_completion
));
838 ASSERT_EQ(0, rados_aio_setxattr(test_data
.m_ioctx
, "foo", my_completion
, attr1
, attr1_buf
, sizeof(attr1_buf
)));
841 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
843 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
844 rados_aio_release(my_completion
);
846 rados_completion_t my_completion2
;
847 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
848 nullptr, nullptr, &my_completion2
));
849 ASSERT_EQ(0, rados_aio_rmxattr(test_data
.m_ioctx
, "foo", my_completion2
, attr1
));
852 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
854 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
855 rados_aio_release(my_completion2
);
856 // async getxattr after deletion
857 rados_completion_t my_completion3
;
858 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
859 nullptr, nullptr, &my_completion3
));
860 ASSERT_EQ(0, rados_aio_getxattr(test_data
.m_ioctx
, "foo", my_completion3
, attr1
, buf
, sizeof(buf
)));
863 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
865 ASSERT_EQ(-ENODATA
, rados_aio_get_return_value(my_completion3
));
866 rados_aio_release(my_completion3
);
867 // Test rmxattr on a removed object
869 char attr2
[] = "attr2";
870 char attr2_buf
[] = "foo bar baz";
871 memset(buf2
, 0xbb, sizeof(buf2
));
872 ASSERT_EQ(0, rados_write(test_data
.m_ioctx
, "foo_rmxattr", buf2
, sizeof(buf2
), 0));
874 rados_completion_t my_completion4
;
875 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
876 nullptr, nullptr, &my_completion4
));
877 ASSERT_EQ(0, rados_aio_setxattr(test_data
.m_ioctx
, "foo_rmxattr", my_completion4
, attr2
, attr2_buf
, sizeof(attr2_buf
)));
880 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion4
));
882 ASSERT_EQ(0, rados_aio_get_return_value(my_completion4
));
883 rados_aio_release(my_completion4
);
885 ASSERT_EQ(0, rados_remove(test_data
.m_ioctx
, "foo_rmxattr"));
886 // async rmxattr on non existing object
887 rados_completion_t my_completion5
;
888 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
889 nullptr, nullptr, &my_completion5
));
890 ASSERT_EQ(0, rados_aio_rmxattr(test_data
.m_ioctx
, "foo_rmxattr", my_completion5
, attr2
));
893 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion5
));
895 ASSERT_EQ(-ENOENT
, rados_aio_get_return_value(my_completion5
));
896 rados_aio_release(my_completion5
);
899 TEST(LibRadosAioPP
, RmXattrPP
) {
901 char attr1
[] = "attr1";
902 char attr1_buf
[] = "foo bar baz";
903 memset(buf
, 0xaa, sizeof(buf
));
905 bl1
.append(buf
, sizeof(buf
));
906 AioTestDataPP test_data
;
907 ASSERT_EQ("", test_data
.init());
908 ASSERT_EQ(0, test_data
.m_ioctx
.append("foo", bl1
, sizeof(buf
)));
911 bl2
.append(attr1_buf
, sizeof(attr1_buf
));
912 boost::scoped_ptr
<AioCompletion
> my_completion
913 (test_data
.m_cluster
.aio_create_completion
914 (nullptr, nullptr, nullptr));
915 ASSERT_EQ(0, test_data
.m_ioctx
.aio_setxattr("foo", my_completion
.get(), attr1
, bl2
));
918 ASSERT_EQ(0, my_completion
->wait_for_complete());
920 ASSERT_EQ(0, my_completion
->get_return_value());
922 AioTestDataPP test_data2
;
923 ASSERT_EQ("", test_data2
.init());
924 boost::scoped_ptr
<AioCompletion
> my_completion2
925 (test_data
.m_cluster
.aio_create_completion
926 (nullptr, nullptr, nullptr));
927 ASSERT_EQ(0, test_data
.m_ioctx
.aio_rmxattr("foo", my_completion2
.get(), attr1
));
930 ASSERT_EQ(0, my_completion2
->wait_for_complete());
932 ASSERT_EQ(0, my_completion2
->get_return_value());
934 AioTestDataPP test_data3
;
935 ASSERT_EQ("", test_data3
.init());
936 boost::scoped_ptr
<AioCompletion
> my_completion3
937 (test_data
.m_cluster
.aio_create_completion
938 (nullptr, nullptr, nullptr));
940 ASSERT_EQ(0, test_data
.m_ioctx
.aio_getxattr("foo", my_completion3
.get(), attr1
, bl3
));
943 ASSERT_EQ(0, my_completion3
->wait_for_complete());
945 ASSERT_EQ(-ENODATA
, my_completion3
->get_return_value());
946 // Test rmxattr on a removed object
948 char attr2
[] = "attr2";
949 char attr2_buf
[] = "foo bar baz";
950 memset(buf2
, 0xbb, sizeof(buf2
));
952 bl21
.append(buf
, sizeof(buf
));
953 ASSERT_EQ(0, test_data
.m_ioctx
.write("foo_rmxattr", bl21
, sizeof(buf2
), 0));
955 bl22
.append(attr2_buf
, sizeof(attr2_buf
));
957 AioTestDataPP test_data4
;
958 ASSERT_EQ("", test_data4
.init());
959 boost::scoped_ptr
<AioCompletion
> my_completion4
960 (test_data
.m_cluster
.aio_create_completion
961 (nullptr, nullptr, nullptr));
962 ASSERT_EQ(0, test_data
.m_ioctx
.aio_setxattr("foo_rmxattr", my_completion4
.get(), attr2
, bl22
));
965 ASSERT_EQ(0, my_completion4
->wait_for_complete());
967 ASSERT_EQ(0, my_completion4
->get_return_value());
969 ASSERT_EQ(0, test_data
.m_ioctx
.remove("foo_rmxattr"));
970 // async rmxattr on non existing object
971 AioTestDataPP test_data5
;
972 ASSERT_EQ("", test_data5
.init());
973 boost::scoped_ptr
<AioCompletion
> my_completion5
974 (test_data
.m_cluster
.aio_create_completion
975 (nullptr, nullptr, nullptr));
976 ASSERT_EQ(0, test_data
.m_ioctx
.aio_rmxattr("foo_rmxattr", my_completion5
.get(), attr2
));
979 ASSERT_EQ(0, my_completion5
->wait_for_complete());
981 ASSERT_EQ(-ENOENT
, my_completion5
->get_return_value());
984 TEST(LibRadosAio
, XattrIter
) {
985 AioTestData test_data
;
986 ASSERT_EQ("", test_data
.init());
987 // Create an object with 2 attributes
989 char attr1
[] = "attr1";
990 char attr1_buf
[] = "foo bar baz";
991 char attr2
[] = "attr2";
993 for (size_t j
= 0; j
< sizeof(attr2_buf
); ++j
) {
994 attr2_buf
[j
] = j
% 0xff;
996 memset(buf
, 0xaa, sizeof(buf
));
997 ASSERT_EQ(0, rados_append(test_data
.m_ioctx
, "foo", buf
, sizeof(buf
)));
998 ASSERT_EQ(0, rados_setxattr(test_data
.m_ioctx
, "foo", attr1
, attr1_buf
, sizeof(attr1_buf
)));
999 ASSERT_EQ(0, rados_setxattr(test_data
.m_ioctx
, "foo", attr2
, attr2_buf
, sizeof(attr2_buf
)));
1000 // call async version of getxattrs and wait for completion
1001 rados_completion_t my_completion
;
1002 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1003 nullptr, nullptr, &my_completion
));
1004 rados_xattrs_iter_t iter
;
1005 ASSERT_EQ(0, rados_aio_getxattrs(test_data
.m_ioctx
, "foo", my_completion
, &iter
));
1008 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1010 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1011 // loop over attributes
1017 ASSERT_EQ(0, rados_getxattrs_next(iter
, &name
, &val
, &len
));
1021 ASSERT_LT(num_seen
, 2);
1022 if ((strcmp(name
, attr1
) == 0) && (val
!= NULL
) && (memcmp(val
, attr1_buf
, len
) == 0)) {
1026 else if ((strcmp(name
, attr2
) == 0) && (val
!= NULL
) && (memcmp(val
, attr2_buf
, len
) == 0)) {
1034 rados_getxattrs_end(iter
);
1037 TEST(LibRadosIoPP
, XattrListPP
) {
1038 AioTestDataPP test_data
;
1039 ASSERT_EQ("", test_data
.init());
1040 // create an object with 2 attributes
1042 char attr1
[] = "attr1";
1043 char attr1_buf
[] = "foo bar baz";
1044 char attr2
[] = "attr2";
1045 char attr2_buf
[256];
1046 for (size_t j
= 0; j
< sizeof(attr2_buf
); ++j
) {
1047 attr2_buf
[j
] = j
% 0xff;
1049 memset(buf
, 0xaa, sizeof(buf
));
1051 bl1
.append(buf
, sizeof(buf
));
1052 ASSERT_EQ(0, test_data
.m_ioctx
.append("foo", bl1
, sizeof(buf
)));
1054 bl2
.append(attr1_buf
, sizeof(attr1_buf
));
1055 ASSERT_EQ(0, test_data
.m_ioctx
.setxattr("foo", attr1
, bl2
));
1057 bl3
.append(attr2_buf
, sizeof(attr2_buf
));
1058 ASSERT_EQ(0, test_data
.m_ioctx
.setxattr("foo", attr2
, bl3
));
1059 // call async version of getxattrs
1060 boost::scoped_ptr
<AioCompletion
> my_completion
1061 (test_data
.m_cluster
.aio_create_completion
1062 (nullptr, nullptr, nullptr));
1063 std::map
<std::string
, bufferlist
> attrset
;
1064 ASSERT_EQ(0, test_data
.m_ioctx
.aio_getxattrs("foo", my_completion
.get(), attrset
));
1067 ASSERT_EQ(0, my_completion
->wait_for_complete());
1069 ASSERT_EQ(0, my_completion
->get_return_value());
1070 for (std::map
<std::string
, bufferlist
>::iterator i
= attrset
.begin();
1071 i
!= attrset
.end(); ++i
) {
1072 if (i
->first
== string(attr1
)) {
1073 ASSERT_EQ(0, memcmp(i
->second
.c_str(), attr1_buf
, sizeof(attr1_buf
)));
1075 else if (i
->first
== string(attr2
)) {
1076 ASSERT_EQ(0, memcmp(i
->second
.c_str(), attr2_buf
, sizeof(attr2_buf
)));
1084 TEST(LibRadosAio
, IsComplete
) {
1085 AioTestData test_data
;
1086 rados_completion_t my_completion
;
1087 ASSERT_EQ("", test_data
.init());
1088 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1089 nullptr, nullptr, &my_completion
));
1091 memset(buf
, 0xcc, sizeof(buf
));
1092 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1093 my_completion
, buf
, sizeof(buf
), 0));
1096 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1098 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1100 memset(buf2
, 0, sizeof(buf2
));
1101 rados_completion_t my_completion2
;
1102 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1103 nullptr, nullptr, &my_completion2
));
1104 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
1105 my_completion2
, buf2
, sizeof(buf2
), 0));
1109 // Busy-wait until the AIO completes.
1110 // Normally we wouldn't do this, but we want to test rados_aio_is_complete.
1112 int is_complete
= rados_aio_is_complete(my_completion2
);
1117 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
1118 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
1119 rados_aio_release(my_completion
);
1120 rados_aio_release(my_completion2
);
1123 TEST(LibRadosAio
, IsCompletePP
) {
1124 AioTestDataPP test_data
;
1125 ASSERT_EQ("", test_data
.init());
1126 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1127 nullptr, nullptr, nullptr);
1128 AioCompletion
*my_completion_null
= NULL
;
1129 ASSERT_NE(my_completion
, my_completion_null
);
1131 memset(buf
, 0xcc, sizeof(buf
));
1133 bl1
.append(buf
, sizeof(buf
));
1134 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1135 bl1
, sizeof(buf
), 0));
1138 ASSERT_EQ(0, my_completion
->wait_for_complete());
1140 ASSERT_EQ(0, my_completion
->get_return_value());
1142 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1143 nullptr, nullptr, nullptr);
1144 ASSERT_NE(my_completion2
, my_completion_null
);
1145 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
1146 &bl2
, sizeof(buf
), 0));
1150 // Busy-wait until the AIO completes.
1151 // Normally we wouldn't do this, but we want to test is_complete.
1153 int is_complete
= my_completion2
->is_complete();
1158 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
1159 ASSERT_EQ(sizeof(buf
), bl2
.length());
1160 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
1161 delete my_completion
;
1162 delete my_completion2
;
1165 TEST(LibRadosAio
, IsSafe
) {
1166 AioTestData test_data
;
1167 rados_completion_t my_completion
;
1168 ASSERT_EQ("", test_data
.init());
1169 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1170 nullptr, nullptr, &my_completion
));
1172 memset(buf
, 0xcc, sizeof(buf
));
1173 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1174 my_completion
, buf
, sizeof(buf
), 0));
1178 // Busy-wait until the AIO completes.
1179 // Normally we wouldn't do this, but we want to test rados_aio_is_safe.
1181 int is_safe
= rados_aio_is_safe(my_completion
);
1186 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1188 memset(buf2
, 0, sizeof(buf2
));
1189 rados_completion_t my_completion2
;
1190 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1191 nullptr, nullptr, &my_completion2
));
1192 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
1193 my_completion2
, buf2
, sizeof(buf2
), 0));
1196 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1198 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
1199 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
1200 rados_aio_release(my_completion
);
1201 rados_aio_release(my_completion2
);
1204 TEST(LibRadosAio
, IsSafePP
) {
1205 AioTestDataPP test_data
;
1206 ASSERT_EQ("", test_data
.init());
1207 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1208 nullptr, nullptr, nullptr);
1209 AioCompletion
*my_completion_null
= NULL
;
1210 ASSERT_NE(my_completion
, my_completion_null
);
1212 memset(buf
, 0xcc, sizeof(buf
));
1214 bl1
.append(buf
, sizeof(buf
));
1215 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1216 bl1
, sizeof(buf
), 0));
1220 // Busy-wait until the AIO completes.
1221 // Normally we wouldn't do this, but we want to test rados_aio_is_safe.
1223 int is_safe
= my_completion
->is_safe();
1228 ASSERT_EQ(0, my_completion
->get_return_value());
1229 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1230 nullptr, nullptr, nullptr);
1232 ASSERT_NE(my_completion2
, my_completion_null
);
1233 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
1234 &bl2
, sizeof(buf
), 0));
1237 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1239 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
1240 ASSERT_EQ(sizeof(buf
), bl2
.length());
1241 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
1242 delete my_completion
;
1243 delete my_completion2
;
1246 TEST(LibRadosAio
, ReturnValue
) {
1247 AioTestData test_data
;
1248 rados_completion_t my_completion
;
1249 ASSERT_EQ("", test_data
.init());
1250 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1251 nullptr, nullptr, &my_completion
));
1253 memset(buf
, 0, sizeof(buf
));
1254 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "nonexistent",
1255 my_completion
, buf
, sizeof(buf
), 0));
1258 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1260 ASSERT_EQ(-ENOENT
, rados_aio_get_return_value(my_completion
));
1261 rados_aio_release(my_completion
);
1264 TEST(LibRadosAio
, ReturnValuePP
) {
1265 AioTestDataPP test_data
;
1266 ASSERT_EQ("", test_data
.init());
1267 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1268 nullptr, nullptr, nullptr);
1269 AioCompletion
*my_completion_null
= NULL
;
1270 ASSERT_NE(my_completion
, my_completion_null
);
1272 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("nonexistent",
1273 my_completion
, &bl1
, 128, 0));
1276 ASSERT_EQ(0, my_completion
->wait_for_complete());
1278 ASSERT_EQ(-ENOENT
, my_completion
->get_return_value());
1279 delete my_completion
;
1282 TEST(LibRadosAio
, Flush
) {
1283 AioTestData test_data
;
1284 rados_completion_t my_completion
;
1285 ASSERT_EQ("", test_data
.init());
1286 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1287 nullptr, nullptr, &my_completion
));
1289 memset(buf
, 0xee, sizeof(buf
));
1290 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1291 my_completion
, buf
, sizeof(buf
), 0));
1292 ASSERT_EQ(0, rados_aio_flush(test_data
.m_ioctx
));
1293 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1295 memset(buf2
, 0, sizeof(buf2
));
1296 rados_completion_t my_completion2
;
1297 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1298 nullptr, nullptr, &my_completion2
));
1299 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
1300 my_completion2
, buf2
, sizeof(buf2
), 0));
1303 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1305 ASSERT_EQ((int)sizeof(buf2
), rados_aio_get_return_value(my_completion2
));
1306 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
1307 rados_aio_release(my_completion
);
1308 rados_aio_release(my_completion2
);
1311 TEST(LibRadosAio
, FlushPP
) {
1312 AioTestDataPP test_data
;
1313 ASSERT_EQ("", test_data
.init());
1314 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1315 nullptr, nullptr, nullptr);
1316 AioCompletion
*my_completion_null
= NULL
;
1317 ASSERT_NE(my_completion
, my_completion_null
);
1319 memset(buf
, 0xee, sizeof(buf
));
1321 bl1
.append(buf
, sizeof(buf
));
1322 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1323 bl1
, sizeof(buf
), 0));
1324 ASSERT_EQ(0, test_data
.m_ioctx
.aio_flush());
1325 ASSERT_EQ(0, my_completion
->get_return_value());
1327 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1328 nullptr, nullptr, nullptr);
1329 ASSERT_NE(my_completion2
, my_completion_null
);
1330 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
1331 &bl2
, sizeof(buf
), 0));
1334 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1336 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
1337 ASSERT_EQ(sizeof(buf
), bl2
.length());
1338 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
1339 delete my_completion
;
1340 delete my_completion2
;
1343 TEST(LibRadosAio
, FlushAsync
) {
1344 AioTestData test_data
;
1345 rados_completion_t my_completion
;
1346 ASSERT_EQ("", test_data
.init());
1347 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1348 nullptr, nullptr, &my_completion
));
1349 rados_completion_t flush_completion
;
1350 ASSERT_EQ(0, rados_aio_create_completion(NULL
, NULL
, NULL
, &flush_completion
));
1352 memset(buf
, 0xee, sizeof(buf
));
1353 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1354 my_completion
, buf
, sizeof(buf
), 0));
1355 ASSERT_EQ(0, rados_aio_flush_async(test_data
.m_ioctx
, flush_completion
));
1358 ASSERT_EQ(0, rados_aio_wait_for_complete(flush_completion
));
1359 ASSERT_EQ(0, rados_aio_wait_for_safe(flush_completion
));
1361 ASSERT_EQ(1, rados_aio_is_complete(my_completion
));
1362 ASSERT_EQ(1, rados_aio_is_safe(my_completion
));
1363 ASSERT_EQ(1, rados_aio_is_complete(flush_completion
));
1364 ASSERT_EQ(1, rados_aio_is_safe(flush_completion
));
1365 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1367 memset(buf2
, 0, sizeof(buf2
));
1368 rados_completion_t my_completion2
;
1369 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1370 nullptr, nullptr, &my_completion2
));
1371 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
1372 my_completion2
, buf2
, sizeof(buf2
), 0));
1375 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1377 ASSERT_EQ((int)sizeof(buf2
), rados_aio_get_return_value(my_completion2
));
1378 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
1379 rados_aio_release(my_completion
);
1380 rados_aio_release(my_completion2
);
1381 rados_aio_release(flush_completion
);
1384 TEST(LibRadosAio
, FlushAsyncPP
) {
1385 AioTestDataPP test_data
;
1386 ASSERT_EQ("", test_data
.init());
1387 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1388 nullptr, nullptr, nullptr);
1389 AioCompletion
*flush_completion
=
1390 test_data
.m_cluster
.aio_create_completion(NULL
, NULL
, NULL
);
1391 AioCompletion
*my_completion_null
= NULL
;
1392 ASSERT_NE(my_completion
, my_completion_null
);
1394 memset(buf
, 0xee, sizeof(buf
));
1396 bl1
.append(buf
, sizeof(buf
));
1397 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1398 bl1
, sizeof(buf
), 0));
1399 ASSERT_EQ(0, test_data
.m_ioctx
.aio_flush_async(flush_completion
));
1402 ASSERT_EQ(0, flush_completion
->wait_for_complete());
1403 ASSERT_EQ(0, flush_completion
->wait_for_safe());
1405 ASSERT_EQ(1, my_completion
->is_complete());
1406 ASSERT_EQ(1, my_completion
->is_safe());
1407 ASSERT_EQ(1, flush_completion
->is_complete());
1408 ASSERT_EQ(1, flush_completion
->is_safe());
1409 ASSERT_EQ(0, my_completion
->get_return_value());
1411 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1412 nullptr, nullptr, nullptr);
1413 ASSERT_NE(my_completion2
, my_completion_null
);
1414 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
1415 &bl2
, sizeof(buf
), 0));
1418 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1420 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
1421 ASSERT_EQ(sizeof(buf
), bl2
.length());
1422 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
1423 delete my_completion
;
1424 delete my_completion2
;
1425 delete flush_completion
;
1428 TEST(LibRadosAio
, RoundTripWriteFull
) {
1429 AioTestData test_data
;
1430 rados_completion_t my_completion
, my_completion2
, my_completion3
;
1431 ASSERT_EQ("", test_data
.init());
1432 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1433 nullptr, nullptr, &my_completion
));
1435 memset(buf
, 0xcc, sizeof(buf
));
1436 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1437 my_completion
, buf
, sizeof(buf
), 0));
1440 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1442 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1444 memset(buf2
, 0xdd, sizeof(buf2
));
1445 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1446 nullptr, nullptr, &my_completion2
));
1447 ASSERT_EQ(0, rados_aio_write_full(test_data
.m_ioctx
, "foo",
1448 my_completion2
, buf2
, sizeof(buf2
)));
1451 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1453 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
1454 char buf3
[sizeof(buf
) + sizeof(buf2
)];
1455 memset(buf3
, 0, sizeof(buf3
));
1456 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1457 nullptr, nullptr, &my_completion3
));
1458 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
1459 my_completion3
, buf3
, sizeof(buf3
), 0));
1462 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
1464 ASSERT_EQ((int)sizeof(buf2
), rados_aio_get_return_value(my_completion3
));
1465 ASSERT_EQ(0, memcmp(buf3
, buf2
, sizeof(buf2
)));
1466 rados_aio_release(my_completion
);
1467 rados_aio_release(my_completion2
);
1468 rados_aio_release(my_completion3
);
1471 TEST(LibRadosAio
, RoundTripWriteFullPP
) {
1472 AioTestDataPP test_data
;
1473 ASSERT_EQ("", test_data
.init());
1474 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1475 nullptr, nullptr, nullptr);
1476 AioCompletion
*my_completion_null
= NULL
;
1477 ASSERT_NE(my_completion
, my_completion_null
);
1479 memset(buf
, 0xcc, sizeof(buf
));
1481 bl1
.append(buf
, sizeof(buf
));
1482 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1483 bl1
, sizeof(buf
), 0));
1486 ASSERT_EQ(0, my_completion
->wait_for_complete());
1488 ASSERT_EQ(0, my_completion
->get_return_value());
1490 memset(buf2
, 0xdd, sizeof(buf2
));
1492 bl2
.append(buf2
, sizeof(buf2
));
1493 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1494 nullptr, nullptr, nullptr);
1495 ASSERT_NE(my_completion2
, my_completion_null
);
1496 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write_full("foo", my_completion2
, bl2
));
1499 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1501 ASSERT_EQ(0, my_completion2
->get_return_value());
1503 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
1504 nullptr, nullptr, nullptr);
1505 ASSERT_NE(my_completion3
, my_completion_null
);
1506 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion3
,
1507 &bl3
, sizeof(buf
), 0));
1510 ASSERT_EQ(0, my_completion3
->wait_for_complete());
1512 ASSERT_EQ((int)sizeof(buf2
), my_completion3
->get_return_value());
1513 ASSERT_EQ(sizeof(buf2
), bl3
.length());
1514 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf2
, sizeof(buf2
)));
1515 delete my_completion
;
1516 delete my_completion2
;
1517 delete my_completion3
;
1520 //using ObjectWriteOperation/ObjectReadOperation with iohint
1521 TEST(LibRadosAio
, RoundTripWriteFullPP2
)
1524 std::string pool_name
= get_temp_pool_name();
1525 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
1527 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
1529 boost::scoped_ptr
<AioCompletion
> my_completion1(cluster
.aio_create_completion(0, 0, 0));
1530 ObjectWriteOperation op
;
1532 memset(buf
, 0xcc, sizeof(buf
));
1537 op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
1538 ioctx
.aio_operate("test_obj", my_completion1
.get(), &op
);
1541 ASSERT_EQ(0, my_completion1
->wait_for_complete());
1543 EXPECT_EQ(0, my_completion1
->get_return_value());
1545 boost::scoped_ptr
<AioCompletion
> my_completion2(cluster
.aio_create_completion(0, 0, 0));
1547 ObjectReadOperation op1
;
1548 op1
.read(0, sizeof(buf
), &bl
, NULL
);
1549 op1
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
|LIBRADOS_OP_FLAG_FADVISE_RANDOM
);
1550 ioctx
.aio_operate("test_obj", my_completion2
.get(), &op1
, 0);
1553 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1555 EXPECT_EQ(0, my_completion2
->get_return_value());
1556 ASSERT_EQ(0, memcmp(buf
, bl
.c_str(), sizeof(buf
)));
1558 ioctx
.remove("test_obj");
1559 destroy_one_pool_pp(pool_name
, cluster
);
1562 TEST(LibRadosAio
, RoundTripWriteSame
) {
1563 AioTestData test_data
;
1564 rados_completion_t my_completion
, my_completion2
, my_completion3
;
1565 ASSERT_EQ("", test_data
.init());
1566 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1567 nullptr, nullptr, &my_completion
));
1569 memset(full
, 0xcc, sizeof(full
));
1570 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1571 my_completion
, full
, sizeof(full
), 0));
1574 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1576 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1577 /* write the same buf four times */
1579 size_t ws_write_len
= sizeof(full
);
1580 memset(buf
, 0xdd, sizeof(buf
));
1581 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1582 nullptr, nullptr, &my_completion2
));
1583 ASSERT_EQ(0, rados_aio_writesame(test_data
.m_ioctx
, "foo",
1584 my_completion2
, buf
, sizeof(buf
),
1588 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1590 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
1591 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1592 nullptr, nullptr, &my_completion3
));
1593 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
1594 my_completion3
, full
, sizeof(full
), 0));
1597 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
1599 ASSERT_EQ((int)sizeof(full
), rados_aio_get_return_value(my_completion3
));
1600 for (char *cmp
= full
; cmp
< full
+ sizeof(full
); cmp
+= sizeof(buf
)) {
1601 ASSERT_EQ(0, memcmp(cmp
, buf
, sizeof(buf
)));
1603 rados_aio_release(my_completion
);
1604 rados_aio_release(my_completion2
);
1605 rados_aio_release(my_completion3
);
1608 TEST(LibRadosAio
, RoundTripWriteSamePP
) {
1609 AioTestDataPP test_data
;
1610 ASSERT_EQ("", test_data
.init());
1611 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1612 nullptr, nullptr, nullptr);
1613 AioCompletion
*my_completion_null
= NULL
;
1614 ASSERT_NE(my_completion
, my_completion_null
);
1616 memset(full
, 0xcc, sizeof(full
));
1618 bl1
.append(full
, sizeof(full
));
1619 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1620 bl1
, sizeof(full
), 0));
1623 ASSERT_EQ(0, my_completion
->wait_for_complete());
1625 ASSERT_EQ(0, my_completion
->get_return_value());
1626 /* write the same buf four times */
1628 size_t ws_write_len
= sizeof(full
);
1629 memset(buf
, 0xdd, sizeof(buf
));
1631 bl2
.append(buf
, sizeof(buf
));
1632 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1633 nullptr, nullptr, nullptr);
1634 ASSERT_NE(my_completion2
, my_completion_null
);
1635 ASSERT_EQ(0, test_data
.m_ioctx
.aio_writesame("foo", my_completion2
, bl2
,
1639 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1641 ASSERT_EQ(0, my_completion2
->get_return_value());
1643 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
1644 nullptr, nullptr, nullptr);
1645 ASSERT_NE(my_completion3
, my_completion_null
);
1646 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion3
,
1647 &bl3
, sizeof(full
), 0));
1650 ASSERT_EQ(0, my_completion3
->wait_for_complete());
1652 ASSERT_EQ((int)sizeof(full
), my_completion3
->get_return_value());
1653 ASSERT_EQ(sizeof(full
), bl3
.length());
1654 for (char *cmp
= bl3
.c_str(); cmp
< bl3
.c_str() + bl3
.length();
1655 cmp
+= sizeof(buf
)) {
1656 ASSERT_EQ(0, memcmp(cmp
, buf
, sizeof(buf
)));
1658 delete my_completion
;
1659 delete my_completion2
;
1660 delete my_completion3
;
1663 TEST(LibRadosAio
, RoundTripWriteSamePP2
)
1666 std::string pool_name
= get_temp_pool_name();
1667 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
1669 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
1671 boost::scoped_ptr
<AioCompletion
>
1672 wr_cmpl(cluster
.aio_create_completion(0, 0, 0));
1673 ObjectWriteOperation op
;
1675 memset(buf
, 0xcc, sizeof(buf
));
1677 bl
.append(buf
, sizeof(buf
));
1679 op
.writesame(0, sizeof(buf
) * 4, bl
);
1680 op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
1681 ioctx
.aio_operate("test_obj", wr_cmpl
.get(), &op
);
1684 ASSERT_EQ(0, wr_cmpl
->wait_for_complete());
1686 EXPECT_EQ(0, wr_cmpl
->get_return_value());
1688 boost::scoped_ptr
<AioCompletion
>
1689 rd_cmpl(cluster
.aio_create_completion(0, 0, 0));
1691 char full
[sizeof(buf
) * 4];
1692 memset(full
, 0, sizeof(full
));
1694 fl
.append(full
, sizeof(full
));
1695 ObjectReadOperation op1
;
1696 op1
.read(0, sizeof(full
), &fl
, NULL
);
1697 op1
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
1698 ioctx
.aio_operate("test_obj", rd_cmpl
.get(), &op1
, 0);
1701 ASSERT_EQ(0, rd_cmpl
->wait_for_complete());
1703 EXPECT_EQ(0, rd_cmpl
->get_return_value());
1704 for (cmp
= fl
.c_str(); cmp
< fl
.c_str() + fl
.length(); cmp
+= sizeof(buf
)) {
1705 ASSERT_EQ(0, memcmp(cmp
, buf
, sizeof(buf
)));
1708 ioctx
.remove("test_obj");
1709 destroy_one_pool_pp(pool_name
, cluster
);
1712 TEST(LibRadosAio
, SimpleStat
) {
1713 AioTestData test_data
;
1714 rados_completion_t my_completion
;
1715 ASSERT_EQ("", test_data
.init());
1716 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1717 nullptr, nullptr, &my_completion
));
1719 memset(buf
, 0xcc, sizeof(buf
));
1720 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1721 my_completion
, buf
, sizeof(buf
), 0));
1724 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1726 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1729 rados_completion_t my_completion2
;
1730 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1731 nullptr, nullptr, &my_completion2
));
1732 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
1733 my_completion2
, &psize
, &pmtime
));
1736 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1738 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
1739 ASSERT_EQ(sizeof(buf
), psize
);
1740 rados_aio_release(my_completion
);
1741 rados_aio_release(my_completion2
);
1744 TEST(LibRadosAio
, SimpleStatPP
) {
1745 AioTestDataPP test_data
;
1746 ASSERT_EQ("", test_data
.init());
1747 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1748 nullptr, nullptr, nullptr);
1749 AioCompletion
*my_completion_null
= NULL
;
1750 ASSERT_NE(my_completion
, my_completion_null
);
1752 memset(buf
, 0xcc, sizeof(buf
));
1754 bl1
.append(buf
, sizeof(buf
));
1755 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1756 bl1
, sizeof(buf
), 0));
1759 ASSERT_EQ(0, my_completion
->wait_for_complete());
1761 ASSERT_EQ(0, my_completion
->get_return_value());
1764 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1765 nullptr, nullptr, nullptr);
1766 ASSERT_NE(my_completion2
, my_completion_null
);
1767 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion2
,
1771 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1773 ASSERT_EQ(0, my_completion2
->get_return_value());
1774 ASSERT_EQ(sizeof(buf
), psize
);
1775 delete my_completion
;
1776 delete my_completion2
;
1779 TEST(LibRadosAio
, SimpleStatNS
) {
1780 AioTestData test_data
;
1781 rados_completion_t my_completion
;
1782 ASSERT_EQ("", test_data
.init());
1783 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1784 nullptr, nullptr, &my_completion
));
1786 memset(buf
, 0xcc, sizeof(buf
));
1787 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1788 my_completion
, buf
, sizeof(buf
), 0));
1791 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1793 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1794 rados_ioctx_set_namespace(test_data
.m_ioctx
, "nspace");
1796 memset(buf2
, 0xbb, sizeof(buf2
));
1797 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1798 nullptr, nullptr, &my_completion
));
1799 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1800 my_completion
, buf2
, sizeof(buf2
), 0));
1803 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1805 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1808 rados_completion_t my_completion2
;
1809 rados_ioctx_set_namespace(test_data
.m_ioctx
, "");
1810 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1811 nullptr, nullptr, &my_completion2
));
1812 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
1813 my_completion2
, &psize
, &pmtime
));
1816 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1818 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
1819 ASSERT_EQ(sizeof(buf
), psize
);
1821 rados_ioctx_set_namespace(test_data
.m_ioctx
, "nspace");
1822 rados_completion_t my_completion3
;
1823 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1824 nullptr, nullptr, &my_completion3
));
1825 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
1826 my_completion3
, &psize
, &pmtime
));
1829 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
1831 ASSERT_EQ(0, rados_aio_get_return_value(my_completion3
));
1832 ASSERT_EQ(sizeof(buf2
), psize
);
1834 rados_aio_release(my_completion
);
1835 rados_aio_release(my_completion2
);
1836 rados_aio_release(my_completion3
);
1839 TEST(LibRadosAio
, SimpleStatPPNS
) {
1840 AioTestDataPP test_data
;
1841 ASSERT_EQ("", test_data
.init());
1842 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1843 nullptr, nullptr, nullptr);
1844 AioCompletion
*my_completion_null
= NULL
;
1845 ASSERT_NE(my_completion
, my_completion_null
);
1847 memset(buf
, 0xcc, sizeof(buf
));
1849 bl1
.append(buf
, sizeof(buf
));
1850 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1851 bl1
, sizeof(buf
), 0));
1854 ASSERT_EQ(0, my_completion
->wait_for_complete());
1856 ASSERT_EQ(0, my_completion
->get_return_value());
1859 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1860 nullptr, nullptr, nullptr);
1861 ASSERT_NE(my_completion2
, my_completion_null
);
1862 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion2
,
1866 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1868 ASSERT_EQ(0, my_completion2
->get_return_value());
1869 ASSERT_EQ(sizeof(buf
), psize
);
1870 delete my_completion
;
1871 delete my_completion2
;
1874 TEST(LibRadosAio
, StatRemove
) {
1875 AioTestData test_data
;
1876 rados_completion_t my_completion
;
1877 ASSERT_EQ("", test_data
.init());
1878 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1879 nullptr, nullptr, &my_completion
));
1881 memset(buf
, 0xcc, sizeof(buf
));
1882 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1883 my_completion
, buf
, sizeof(buf
), 0));
1886 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
1888 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
1891 rados_completion_t my_completion2
;
1892 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1893 nullptr, nullptr, &my_completion2
));
1894 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
1895 my_completion2
, &psize
, &pmtime
));
1898 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
1900 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
1901 ASSERT_EQ(sizeof(buf
), psize
);
1902 rados_completion_t my_completion3
;
1903 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1904 nullptr, nullptr, &my_completion3
));
1905 ASSERT_EQ(0, rados_aio_remove(test_data
.m_ioctx
, "foo", my_completion3
));
1908 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
1910 ASSERT_EQ(0, rados_aio_get_return_value(my_completion3
));
1913 rados_completion_t my_completion4
;
1914 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1915 nullptr, nullptr, &my_completion4
));
1916 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
1917 my_completion4
, &psize2
, &pmtime2
));
1920 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion4
));
1922 ASSERT_EQ(-ENOENT
, rados_aio_get_return_value(my_completion4
));
1923 rados_aio_release(my_completion
);
1924 rados_aio_release(my_completion2
);
1925 rados_aio_release(my_completion3
);
1926 rados_aio_release(my_completion4
);
1929 TEST(LibRadosAio
, StatRemovePP
) {
1930 AioTestDataPP test_data
;
1931 ASSERT_EQ("", test_data
.init());
1932 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
1933 nullptr, nullptr, nullptr);
1934 AioCompletion
*my_completion_null
= NULL
;
1935 ASSERT_NE(my_completion
, my_completion_null
);
1937 memset(buf
, 0xcc, sizeof(buf
));
1939 bl1
.append(buf
, sizeof(buf
));
1940 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
1941 bl1
, sizeof(buf
), 0));
1944 ASSERT_EQ(0, my_completion
->wait_for_complete());
1946 ASSERT_EQ(0, my_completion
->get_return_value());
1949 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
1950 nullptr, nullptr, nullptr);
1951 ASSERT_NE(my_completion2
, my_completion_null
);
1952 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion2
,
1956 ASSERT_EQ(0, my_completion2
->wait_for_complete());
1958 ASSERT_EQ(0, my_completion2
->get_return_value());
1959 ASSERT_EQ(sizeof(buf
), psize
);
1962 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
1963 nullptr, nullptr, nullptr);
1964 ASSERT_NE(my_completion3
, my_completion_null
);
1965 ASSERT_EQ(0, test_data
.m_ioctx
.aio_remove("foo", my_completion3
));
1968 ASSERT_EQ(0, my_completion3
->wait_for_complete());
1970 ASSERT_EQ(0, my_completion3
->get_return_value());
1972 AioCompletion
*my_completion4
= test_data
.m_cluster
.aio_create_completion(
1973 nullptr, nullptr, nullptr);
1974 ASSERT_NE(my_completion4
, my_completion_null
);
1975 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion4
,
1976 &psize2
, &pmtime2
));
1979 ASSERT_EQ(0, my_completion4
->wait_for_complete());
1981 ASSERT_EQ(-ENOENT
, my_completion4
->get_return_value());
1982 delete my_completion
;
1983 delete my_completion2
;
1984 delete my_completion3
;
1985 delete my_completion4
;
1988 TEST(LibRadosAio
, ExecuteClass
) {
1989 AioTestData test_data
;
1990 rados_completion_t my_completion
;
1991 ASSERT_EQ("", test_data
.init());
1992 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
1993 nullptr, nullptr, &my_completion
));
1995 memset(buf
, 0xcc, sizeof(buf
));
1996 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
1997 my_completion
, buf
, sizeof(buf
), 0));
2000 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2002 rados_completion_t my_completion2
;
2003 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2004 nullptr, nullptr, &my_completion2
));
2006 ASSERT_EQ(0, rados_aio_exec(test_data
.m_ioctx
, "foo", my_completion2
,
2007 "hello", "say_hello", NULL
, 0, out
, sizeof(out
)));
2010 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
2012 ASSERT_EQ(13, rados_aio_get_return_value(my_completion2
));
2013 ASSERT_EQ(0, strncmp("Hello, world!", out
, 13));
2014 rados_aio_release(my_completion
);
2015 rados_aio_release(my_completion2
);
2018 TEST(LibRadosAio
, ExecuteClassPP
) {
2019 AioTestDataPP test_data
;
2020 ASSERT_EQ("", test_data
.init());
2021 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2022 nullptr, nullptr, nullptr);
2023 AioCompletion
*my_completion_null
= NULL
;
2024 ASSERT_NE(my_completion
, my_completion_null
);
2026 memset(buf
, 0xcc, sizeof(buf
));
2028 bl1
.append(buf
, sizeof(buf
));
2029 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
2030 bl1
, sizeof(buf
), 0));
2033 ASSERT_EQ(0, my_completion
->wait_for_complete());
2035 ASSERT_EQ(0, my_completion
->get_return_value());
2036 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
2037 nullptr, nullptr, nullptr);
2038 ASSERT_NE(my_completion2
, my_completion_null
);
2040 ASSERT_EQ(0, test_data
.m_ioctx
.aio_exec("foo", my_completion2
,
2041 "hello", "say_hello", in
, &out
));
2044 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2046 ASSERT_EQ(0, my_completion2
->get_return_value());
2047 ASSERT_EQ(std::string("Hello, world!"), std::string(out
.c_str(), out
.length()));
2048 delete my_completion
;
2049 delete my_completion2
;
2056 TEST(LibRadosAio
, OmapPP
) {
2058 std::string pool_name
= get_temp_pool_name();
2059 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
2061 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
2063 string header_str
= "baz";
2064 bufferptr
bp(header_str
.c_str(), header_str
.size() + 1);
2065 bufferlist header_to_set
;
2066 header_to_set
.push_back(bp
);
2067 map
<string
, bufferlist
> to_set
;
2069 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2070 ObjectWriteOperation op
;
2071 to_set
["foo"] = header_to_set
;
2072 to_set
["foo2"] = header_to_set
;
2073 to_set
["qfoo3"] = header_to_set
;
2074 op
.omap_set(to_set
);
2076 op
.omap_set_header(header_to_set
);
2078 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
);
2081 ASSERT_EQ(0, my_completion
->wait_for_complete());
2083 EXPECT_EQ(0, my_completion
->get_return_value());
2087 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2088 ObjectReadOperation op
;
2089 map
<string
, pair
<bufferlist
, int> > assertions
;
2091 val
.append(string("bar"));
2092 assertions
["foo"] = pair
<bufferlist
, int>(val
, CEPH_OSD_CMPXATTR_OP_EQ
);
2095 op
.omap_cmp(assertions
, &r
);
2097 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
, 0);
2100 ASSERT_EQ(0, my_completion
->wait_for_complete());
2102 EXPECT_EQ(-ECANCELED
, my_completion
->get_return_value());
2103 ASSERT_EQ(-ECANCELED
, r
);
2107 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2108 ObjectReadOperation op
;
2110 set
<string
> set_got
;
2111 map
<string
, bufferlist
> map_got
;
2114 map
<string
, bufferlist
> got3
;
2116 map
<string
, bufferlist
> got4
;
2120 op
.omap_get_keys2("", 1, &set_got
, nullptr, 0);
2121 op
.omap_get_vals2("foo", 1, &map_got
, nullptr, 0);
2123 to_get
.insert("foo");
2124 to_get
.insert("qfoo3");
2125 op
.omap_get_vals_by_keys(to_get
, &got3
, 0);
2127 op
.omap_get_header(&header
, 0);
2129 op
.omap_get_vals2("foo2", "q", 1, &got4
, nullptr, 0);
2131 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
, 0);
2134 ASSERT_EQ(0, my_completion
->wait_for_complete());
2136 EXPECT_EQ(0, my_completion
->get_return_value());
2138 ASSERT_EQ(header
.length(), header_to_set
.length());
2139 ASSERT_EQ(set_got
.size(), (unsigned)1);
2140 ASSERT_EQ(*set_got
.begin(), "foo");
2141 ASSERT_EQ(map_got
.size(), (unsigned)1);
2142 ASSERT_EQ(map_got
.begin()->first
, "foo2");
2143 ASSERT_EQ(got3
.size(), (unsigned)2);
2144 ASSERT_EQ(got3
.begin()->first
, "foo");
2145 ASSERT_EQ(got3
.rbegin()->first
, "qfoo3");
2146 ASSERT_EQ(got4
.size(), (unsigned)1);
2147 ASSERT_EQ(got4
.begin()->first
, "qfoo3");
2151 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2152 ObjectWriteOperation op
;
2153 set
<string
> to_remove
;
2154 to_remove
.insert("foo2");
2155 op
.omap_rm_keys(to_remove
);
2156 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
);
2159 ASSERT_EQ(0, my_completion
->wait_for_complete());
2161 EXPECT_EQ(0, my_completion
->get_return_value());
2165 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2166 ObjectReadOperation op
;
2168 set
<string
> set_got
;
2169 op
.omap_get_keys2("", -1, &set_got
, nullptr, 0);
2170 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
, 0);
2173 ASSERT_EQ(0, my_completion
->wait_for_complete());
2175 EXPECT_EQ(0, my_completion
->get_return_value());
2176 ASSERT_EQ(set_got
.size(), (unsigned)2);
2180 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2181 ObjectWriteOperation op
;
2183 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
);
2186 ASSERT_EQ(0, my_completion
->wait_for_complete());
2188 EXPECT_EQ(0, my_completion
->get_return_value());
2192 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2193 ObjectReadOperation op
;
2195 set
<string
> set_got
;
2196 op
.omap_get_keys2("", -1, &set_got
, nullptr, 0);
2197 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
, 0);
2200 ASSERT_EQ(0, my_completion
->wait_for_complete());
2202 EXPECT_EQ(0, my_completion
->get_return_value());
2203 ASSERT_EQ(set_got
.size(), (unsigned)0);
2206 // omap_clear clears header *and* keys
2208 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2209 ObjectWriteOperation op
;
2211 bl
.append("some data");
2212 map
<string
,bufferlist
> to_set
;
2214 to_set
["foo2"] = bl
;
2215 to_set
["qfoo3"] = bl
;
2216 op
.omap_set(to_set
);
2217 op
.omap_set_header(bl
);
2218 ioctx
.aio_operate("foo3", my_completion
.get(), &op
);
2221 ASSERT_EQ(0, my_completion
->wait_for_complete());
2223 EXPECT_EQ(0, my_completion
->get_return_value());
2226 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2227 ObjectWriteOperation op
;
2229 ioctx
.aio_operate("foo3", my_completion
.get(), &op
);
2232 ASSERT_EQ(0, my_completion
->wait_for_complete());
2234 EXPECT_EQ(0, my_completion
->get_return_value());
2237 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
2238 ObjectReadOperation op
;
2239 set
<string
> set_got
;
2241 op
.omap_get_keys2("", -1, &set_got
, nullptr, 0);
2242 op
.omap_get_header(&hdr
, NULL
);
2243 ioctx
.aio_operate("foo3", my_completion
.get(), &op
, 0);
2246 ASSERT_EQ(0, my_completion
->wait_for_complete());
2248 EXPECT_EQ(0, my_completion
->get_return_value());
2249 ASSERT_EQ(set_got
.size(), (unsigned)0);
2250 ASSERT_EQ(hdr
.length(), 0u);
2253 ioctx
.remove("test_obj");
2254 destroy_one_pool_pp(pool_name
, cluster
);
2257 TEST(LibRadosAio
, MultiWrite
) {
2258 AioTestData test_data
;
2259 rados_completion_t my_completion
, my_completion2
, my_completion3
;
2260 ASSERT_EQ("", test_data
.init());
2261 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2262 nullptr, nullptr, &my_completion
));
2264 memset(buf
, 0xcc, sizeof(buf
));
2265 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2266 my_completion
, buf
, sizeof(buf
), 0));
2269 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2271 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2274 memset(buf2
, 0xdd, sizeof(buf2
));
2275 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2276 nullptr, nullptr, &my_completion2
));
2277 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2278 my_completion2
, buf2
, sizeof(buf2
), sizeof(buf
)));
2281 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
2283 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
2285 char buf3
[(sizeof(buf
) + sizeof(buf2
)) * 3];
2286 memset(buf3
, 0, sizeof(buf3
));
2287 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2288 nullptr, nullptr, &my_completion3
));
2289 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
2290 my_completion3
, buf3
, sizeof(buf3
), 0));
2293 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
2295 ASSERT_EQ((int)(sizeof(buf
) + sizeof(buf2
)), rados_aio_get_return_value(my_completion3
));
2296 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
2297 ASSERT_EQ(0, memcmp(buf3
+ sizeof(buf
), buf2
, sizeof(buf2
)));
2298 rados_aio_release(my_completion
);
2299 rados_aio_release(my_completion2
);
2300 rados_aio_release(my_completion3
);
2303 TEST(LibRadosAio
, MultiWritePP
) {
2304 AioTestDataPP test_data
;
2305 ASSERT_EQ("", test_data
.init());
2306 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2307 nullptr, nullptr, nullptr);
2308 AioCompletion
*my_completion_null
= NULL
;
2309 ASSERT_NE(my_completion
, my_completion_null
);
2311 memset(buf
, 0xcc, sizeof(buf
));
2313 bl1
.append(buf
, sizeof(buf
));
2314 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
2315 bl1
, sizeof(buf
), 0));
2318 ASSERT_EQ(0, my_completion
->wait_for_complete());
2320 ASSERT_EQ(0, my_completion
->get_return_value());
2323 memset(buf2
, 0xdd, sizeof(buf2
));
2325 bl2
.append(buf2
, sizeof(buf2
));
2326 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
2327 nullptr, nullptr, nullptr);
2328 ASSERT_NE(my_completion2
, my_completion_null
);
2329 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion2
,
2330 bl2
, sizeof(buf2
), sizeof(buf
)));
2333 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2335 ASSERT_EQ(0, my_completion2
->get_return_value());
2338 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
2339 nullptr, nullptr, nullptr);
2340 ASSERT_NE(my_completion3
, my_completion_null
);
2341 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion3
,
2342 &bl3
, (sizeof(buf
) + sizeof(buf2
) * 3), 0));
2345 ASSERT_EQ(0, my_completion3
->wait_for_complete());
2347 ASSERT_EQ((int)(sizeof(buf
) + sizeof(buf2
)), my_completion3
->get_return_value());
2348 ASSERT_EQ(sizeof(buf
) + sizeof(buf2
), bl3
.length());
2349 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf
, sizeof(buf
)));
2350 ASSERT_EQ(0, memcmp(bl3
.c_str() + sizeof(buf
), buf2
, sizeof(buf2
)));
2351 delete my_completion
;
2352 delete my_completion2
;
2353 delete my_completion3
;
2356 TEST(LibRadosAio
, AioUnlock
) {
2357 AioTestData test_data
;
2358 ASSERT_EQ("", test_data
.init());
2359 ASSERT_EQ(0, rados_lock_exclusive(test_data
.m_ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
2360 rados_completion_t my_completion
;
2361 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2362 nullptr, nullptr, &my_completion
));
2363 ASSERT_EQ(0, rados_aio_unlock(test_data
.m_ioctx
, "foo", "TestLock", "Cookie", my_completion
));
2366 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2368 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2369 ASSERT_EQ(0, rados_lock_exclusive(test_data
.m_ioctx
, "foo", "TestLock", "Cookie", "", NULL
, 0));
2372 TEST(LibRadosAio
, AioUnlockPP
) {
2373 AioTestDataPP test_data
;
2374 ASSERT_EQ("", test_data
.init());
2375 ASSERT_EQ(0, test_data
.m_ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
2376 boost::scoped_ptr
<AioCompletion
> my_completion
2377 (test_data
.m_cluster
.aio_create_completion
2378 (nullptr, nullptr, nullptr));
2379 ASSERT_EQ(0, test_data
.m_ioctx
.aio_unlock("foo", "TestLock", "Cookie", my_completion
.get()));
2382 ASSERT_EQ(0, my_completion
->wait_for_complete());
2384 ASSERT_EQ(0, my_completion
->get_return_value());
2386 ASSERT_EQ(0, test_data
.m_ioctx
.lock_exclusive("foo", "TestLock", "Cookie", "", NULL
, 0));
2403 rados_ioctx_destroy(m_ioctx
);
2404 destroy_one_ec_pool(m_pool_name
, &m_cluster
);
2411 m_pool_name
= get_temp_pool_name();
2412 std::string err
= create_one_ec_pool(m_pool_name
, &m_cluster
);
2415 oss
<< "create_one_ec_pool(" << m_pool_name
<< ") failed: error " << err
;
2418 ret
= rados_ioctx_create(m_cluster
, m_pool_name
.c_str(), &m_ioctx
);
2420 destroy_one_ec_pool(m_pool_name
, &m_cluster
);
2422 oss
<< "rados_ioctx_create failed: error " << ret
;
2430 rados_ioctx_t m_ioctx
;
2431 std::string m_pool_name
;
2435 class AioTestDataECPP
2447 destroy_one_ec_pool_pp(m_pool_name
, m_cluster
);
2454 m_pool_name
= get_temp_pool_name();
2455 std::string err
= create_one_ec_pool_pp(m_pool_name
, m_cluster
);
2458 oss
<< "create_one_ec_pool(" << m_pool_name
<< ") failed: error " << err
;
2461 ret
= m_cluster
.ioctx_create(m_pool_name
.c_str(), m_ioctx
);
2463 destroy_one_ec_pool_pp(m_pool_name
, m_cluster
);
2465 oss
<< "rados_ioctx_create failed: error " << ret
;
2474 std::string m_pool_name
;
2478 TEST(LibRadosAioEC
, SimpleWrite
) {
2479 AioTestDataEC test_data
;
2480 rados_completion_t my_completion
;
2481 ASSERT_EQ("", test_data
.init());
2482 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2483 nullptr, nullptr, &my_completion
));
2485 memset(buf
, 0xcc, sizeof(buf
));
2486 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2487 my_completion
, buf
, sizeof(buf
), 0));
2490 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2492 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2494 rados_ioctx_set_namespace(test_data
.m_ioctx
, "nspace");
2495 rados_completion_t my_completion2
;
2496 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2497 nullptr, nullptr, &my_completion2
));
2498 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2499 my_completion2
, buf
, sizeof(buf
), 0));
2502 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
2504 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
2505 rados_aio_release(my_completion
);
2506 rados_aio_release(my_completion2
);
2509 TEST(LibRadosAioEC
, SimpleWritePP
) {
2511 memset(buf
, 0xcc, sizeof(buf
));
2513 bl1
.append(buf
, sizeof(buf
));
2515 AioTestDataECPP test_data
;
2516 ASSERT_EQ("", test_data
.init());
2517 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2518 nullptr, nullptr, nullptr);
2519 AioCompletion
*my_completion_null
= NULL
;
2520 ASSERT_NE(my_completion
, my_completion_null
);
2521 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo",
2522 my_completion
, bl1
, sizeof(buf
), 0));
2525 ASSERT_EQ(0, my_completion
->wait_for_complete());
2527 ASSERT_EQ(0, my_completion
->get_return_value());
2528 delete my_completion
;
2532 AioTestDataECPP test_data
;
2533 ASSERT_EQ("", test_data
.init());
2534 test_data
.m_ioctx
.set_namespace("nspace");
2535 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2536 nullptr, nullptr, nullptr);
2537 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo",
2538 my_completion
, bl1
, sizeof(buf
), 0));
2541 ASSERT_EQ(0, my_completion
->wait_for_complete());
2543 ASSERT_EQ(0, my_completion
->get_return_value());
2544 delete my_completion
;
2548 TEST(LibRadosAioEC
, WaitForSafe
) {
2549 AioTestDataEC test_data
;
2550 rados_completion_t my_completion
;
2551 ASSERT_EQ("", test_data
.init());
2552 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2553 nullptr, nullptr, &my_completion
));
2555 memset(buf
, 0xcc, sizeof(buf
));
2556 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2557 my_completion
, buf
, sizeof(buf
), 0));
2559 ASSERT_EQ(0, rados_aio_wait_for_safe(my_completion
));
2560 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2561 rados_aio_release(my_completion
);
2564 TEST(LibRadosAioEC
, WaitForSafePP
) {
2565 AioTestDataECPP test_data
;
2566 ASSERT_EQ("", test_data
.init());
2567 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2568 nullptr, nullptr, nullptr);
2569 AioCompletion
*my_completion_null
= NULL
;
2570 ASSERT_NE(my_completion
, my_completion_null
);
2572 memset(buf
, 0xcc, sizeof(buf
));
2574 bl1
.append(buf
, sizeof(buf
));
2575 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo",
2576 my_completion
, bl1
, sizeof(buf
), 0));
2578 ASSERT_EQ(0, my_completion
->wait_for_safe());
2579 ASSERT_EQ(0, my_completion
->get_return_value());
2580 delete my_completion
;
2583 TEST(LibRadosAioEC
, RoundTrip
) {
2584 AioTestDataEC test_data
;
2585 rados_completion_t my_completion
;
2586 ASSERT_EQ("", test_data
.init());
2587 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2588 nullptr, nullptr, &my_completion
));
2590 memset(buf
, 0xcc, sizeof(buf
));
2591 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2592 my_completion
, buf
, sizeof(buf
), 0));
2595 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2597 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2599 memset(buf2
, 0, sizeof(buf2
));
2600 rados_completion_t my_completion2
;
2601 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2602 nullptr, nullptr, &my_completion2
));
2603 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
2604 my_completion2
, buf2
, sizeof(buf2
), 0));
2607 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
2609 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
2610 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
2611 rados_aio_release(my_completion
);
2612 rados_aio_release(my_completion2
);
2615 TEST(LibRadosAioEC
, RoundTrip2
) {
2616 AioTestDataEC test_data
;
2617 rados_completion_t my_completion
;
2618 ASSERT_EQ("", test_data
.init());
2619 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2620 nullptr, nullptr, &my_completion
));
2622 memset(buf
, 0xcc, sizeof(buf
));
2623 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2624 my_completion
, buf
, sizeof(buf
), 0));
2627 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2629 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2631 memset(buf2
, 0, sizeof(buf2
));
2632 rados_completion_t my_completion2
;
2633 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2634 nullptr, nullptr, &my_completion2
));
2635 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
2636 my_completion2
, buf2
, sizeof(buf2
), 0));
2639 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
2641 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
2642 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
2643 rados_aio_release(my_completion
);
2644 rados_aio_release(my_completion2
);
2647 TEST(LibRadosAioEC
, RoundTripPP
) {
2648 AioTestDataECPP test_data
;
2649 ASSERT_EQ("", test_data
.init());
2650 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2651 nullptr, nullptr, nullptr);
2652 AioCompletion
*my_completion_null
= NULL
;
2653 ASSERT_NE(my_completion
, my_completion_null
);
2655 memset(buf
, 0xcc, sizeof(buf
));
2657 bl1
.append(buf
, sizeof(buf
));
2658 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
2659 bl1
, sizeof(buf
), 0));
2662 ASSERT_EQ(0, my_completion
->wait_for_complete());
2664 ASSERT_EQ(0, my_completion
->get_return_value());
2666 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
2667 nullptr, nullptr, nullptr);
2668 ASSERT_NE(my_completion2
, my_completion_null
);
2669 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo",
2670 my_completion2
, &bl2
, sizeof(buf
), 0));
2673 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2675 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
2676 ASSERT_EQ(sizeof(buf
), bl2
.length());
2677 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
2678 delete my_completion
;
2679 delete my_completion2
;
2682 TEST(LibRadosAioEC
, RoundTripPP2
) {
2683 AioTestDataECPP test_data
;
2684 ASSERT_EQ("", test_data
.init());
2685 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2686 nullptr, nullptr, nullptr);
2687 AioCompletion
*my_completion_null
= NULL
;
2688 ASSERT_NE(my_completion
, my_completion_null
);
2690 memset(buf
, 0xcc, sizeof(buf
));
2692 bl1
.append(buf
, sizeof(buf
));
2693 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
2694 bl1
, sizeof(buf
), 0));
2697 ASSERT_EQ(0, my_completion
->wait_for_complete());
2699 ASSERT_EQ(0, my_completion
->get_return_value());
2701 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
2702 nullptr, nullptr, nullptr);
2703 ASSERT_NE(my_completion2
, my_completion_null
);
2704 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo",
2705 my_completion2
, &bl2
, sizeof(buf
), 0));
2708 ASSERT_EQ(0, my_completion2
->wait_for_safe());
2709 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2711 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
2712 ASSERT_EQ(sizeof(buf
), bl2
.length());
2713 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
2714 delete my_completion
;
2715 delete my_completion2
;
2718 //using ObjectWriteOperation/ObjectReadOperation with iohint
2719 TEST(LibRadosAioEC
, RoundTripPP3
)
2722 std::string pool_name
= get_temp_pool_name();
2723 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
2725 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
2727 boost::scoped_ptr
<AioCompletion
> my_completion1(cluster
.aio_create_completion(0, 0, 0));
2728 ObjectWriteOperation op
;
2730 memset(buf
, 0xcc, sizeof(buf
));
2735 op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
2736 ioctx
.aio_operate("test_obj", my_completion1
.get(), &op
);
2739 ASSERT_EQ(0, my_completion1
->wait_for_complete());
2741 EXPECT_EQ(0, my_completion1
->get_return_value());
2743 boost::scoped_ptr
<AioCompletion
> my_completion2(cluster
.aio_create_completion(0, 0, 0));
2745 ObjectReadOperation op1
;
2746 op1
.read(0, sizeof(buf
), &bl
, NULL
);
2747 op1
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
|LIBRADOS_OP_FLAG_FADVISE_RANDOM
);
2748 ioctx
.aio_operate("test_obj", my_completion2
.get(), &op1
, 0);
2751 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2753 EXPECT_EQ(0, my_completion2
->get_return_value());
2754 ASSERT_EQ(0, memcmp(buf
, bl
.c_str(), sizeof(buf
)));
2756 ioctx
.remove("test_obj");
2757 destroy_one_pool_pp(pool_name
, cluster
);
2760 TEST(LibRadosAioEC
, RoundTripSparseReadPP
) {
2761 AioTestDataECPP test_data
;
2762 ASSERT_EQ("", test_data
.init());
2763 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2764 nullptr, nullptr, nullptr);
2765 AioCompletion
*my_completion_null
= NULL
;
2766 ASSERT_NE(my_completion
, my_completion_null
);
2768 memset(buf
, 0xcc, sizeof(buf
));
2770 bl1
.append(buf
, sizeof(buf
));
2771 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
2772 bl1
, sizeof(buf
), 0));
2775 ASSERT_EQ(0, my_completion
->wait_for_complete());
2777 ASSERT_EQ(0, my_completion
->get_return_value());
2779 map
<uint64_t, uint64_t> extents
;
2781 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
2782 nullptr, nullptr, nullptr);
2783 ASSERT_NE(my_completion2
, my_completion_null
);
2784 ASSERT_EQ(0, test_data
.m_ioctx
.aio_sparse_read("foo",
2785 my_completion2
, &extents
, &bl2
, sizeof(buf
), 0));
2788 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2790 ASSERT_EQ(0, my_completion2
->get_return_value());
2791 assert_eq_sparse(bl1
, extents
, bl2
);
2792 delete my_completion
;
2793 delete my_completion2
;
2796 TEST(LibRadosAioEC
, RoundTripAppend
) {
2797 AioTestDataEC test_data
;
2798 rados_completion_t my_completion
, my_completion2
, my_completion3
, my_completion4
;
2799 ASSERT_EQ("", test_data
.init());
2800 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2801 nullptr, nullptr, &my_completion
));
2803 ASSERT_EQ(0, rados_ioctx_pool_requires_alignment2(test_data
.m_ioctx
, &requires
));
2804 ASSERT_NE(0, requires
);
2806 ASSERT_EQ(0, rados_ioctx_pool_required_alignment2(test_data
.m_ioctx
, &alignment
));
2807 ASSERT_NE(0U, alignment
);
2809 int bsize
= alignment
;
2810 char *buf
= (char *)new char[bsize
];
2811 memset(buf
, 0xcc, bsize
);
2812 ASSERT_EQ(0, rados_aio_append(test_data
.m_ioctx
, "foo",
2813 my_completion
, buf
, bsize
));
2816 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2818 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2820 int hbsize
= bsize
/ 2;
2821 char *buf2
= (char *)new char[hbsize
];
2822 memset(buf2
, 0xdd, hbsize
);
2823 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2824 nullptr, nullptr, &my_completion2
));
2825 ASSERT_EQ(0, rados_aio_append(test_data
.m_ioctx
, "foo",
2826 my_completion2
, buf2
, hbsize
));
2829 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
2831 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
2833 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2834 nullptr, nullptr, &my_completion3
));
2835 ASSERT_EQ(0, rados_aio_append(test_data
.m_ioctx
, "foo",
2836 my_completion3
, buf2
, hbsize
));
2839 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
2841 EXPECT_EQ(-EOPNOTSUPP
, rados_aio_get_return_value(my_completion3
));
2843 int tbsize
= bsize
+ hbsize
;
2844 char *buf3
= (char *)new char[tbsize
];
2845 memset(buf3
, 0, tbsize
);
2846 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2847 nullptr, nullptr, &my_completion4
));
2848 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
2849 my_completion4
, buf3
, bsize
* 3, 0));
2852 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion4
));
2854 ASSERT_EQ(tbsize
, rados_aio_get_return_value(my_completion4
));
2855 ASSERT_EQ(0, memcmp(buf3
, buf
, bsize
));
2856 ASSERT_EQ(0, memcmp(buf3
+ bsize
, buf2
, hbsize
));
2857 rados_aio_release(my_completion
);
2858 rados_aio_release(my_completion2
);
2859 rados_aio_release(my_completion3
);
2860 rados_aio_release(my_completion4
);
2866 TEST(LibRadosAioEC
, RoundTripAppendPP
) {
2867 AioTestDataECPP test_data
;
2868 ASSERT_EQ("", test_data
.init());
2869 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2870 nullptr, nullptr, nullptr);
2871 AioCompletion
*my_completion_null
= NULL
;
2872 ASSERT_NE(my_completion
, my_completion_null
);
2874 ASSERT_EQ(0, test_data
.m_ioctx
.pool_requires_alignment2(&requires
));
2875 ASSERT_TRUE(requires
);
2877 ASSERT_EQ(0, test_data
.m_ioctx
.pool_required_alignment2(&alignment
));
2878 ASSERT_NE((unsigned)0, alignment
);
2879 int bsize
= alignment
;
2880 char *buf
= (char *)new char[bsize
];
2881 memset(buf
, 0xcc, bsize
);
2883 bl1
.append(buf
, bsize
);
2884 ASSERT_EQ(0, test_data
.m_ioctx
.aio_append("foo", my_completion
,
2888 ASSERT_EQ(0, my_completion
->wait_for_complete());
2890 ASSERT_EQ(0, my_completion
->get_return_value());
2892 int hbsize
= bsize
/ 2;
2893 char *buf2
= (char *)new char[hbsize
];
2894 memset(buf2
, 0xdd, hbsize
);
2896 bl2
.append(buf2
, hbsize
);
2897 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
2898 nullptr, nullptr, nullptr);
2899 ASSERT_NE(my_completion2
, my_completion_null
);
2900 ASSERT_EQ(0, test_data
.m_ioctx
.aio_append("foo", my_completion2
,
2904 ASSERT_EQ(0, my_completion2
->wait_for_complete());
2906 ASSERT_EQ(0, my_completion2
->get_return_value());
2908 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
2909 nullptr, nullptr, nullptr);
2910 ASSERT_NE(my_completion3
, my_completion_null
);
2911 ASSERT_EQ(0, test_data
.m_ioctx
.aio_append("foo", my_completion3
,
2915 ASSERT_EQ(0, my_completion3
->wait_for_complete());
2917 EXPECT_EQ(-EOPNOTSUPP
, my_completion3
->get_return_value());
2920 AioCompletion
*my_completion4
= test_data
.m_cluster
.aio_create_completion(
2921 nullptr, nullptr, nullptr);
2922 ASSERT_NE(my_completion4
, my_completion_null
);
2923 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo",
2924 my_completion4
, &bl3
, bsize
* 3, 0));
2927 ASSERT_EQ(0, my_completion4
->wait_for_complete());
2929 int tbsize
= bsize
+ hbsize
;
2930 ASSERT_EQ(tbsize
, my_completion4
->get_return_value());
2931 ASSERT_EQ((unsigned)tbsize
, bl3
.length());
2932 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf
, bsize
));
2933 ASSERT_EQ(0, memcmp(bl3
.c_str() + bsize
, buf2
, hbsize
));
2934 delete my_completion
;
2935 delete my_completion2
;
2936 delete my_completion3
;
2941 TEST(LibRadosAioEC
, IsComplete
) {
2942 AioTestDataEC test_data
;
2943 rados_completion_t my_completion
;
2944 ASSERT_EQ("", test_data
.init());
2945 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2946 nullptr, nullptr, &my_completion
));
2948 memset(buf
, 0xcc, sizeof(buf
));
2949 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
2950 my_completion
, buf
, sizeof(buf
), 0));
2953 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
2955 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
2957 memset(buf2
, 0, sizeof(buf2
));
2958 rados_completion_t my_completion2
;
2959 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
2960 nullptr, nullptr, &my_completion2
));
2961 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
2962 my_completion2
, buf2
, sizeof(buf2
), 0));
2966 // Busy-wait until the AIO completes.
2967 // Normally we wouldn't do this, but we want to test rados_aio_is_complete.
2969 int is_complete
= rados_aio_is_complete(my_completion2
);
2974 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
2975 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
2976 rados_aio_release(my_completion
);
2977 rados_aio_release(my_completion2
);
2980 TEST(LibRadosAioEC
, IsCompletePP
) {
2981 AioTestDataECPP test_data
;
2982 ASSERT_EQ("", test_data
.init());
2983 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
2984 nullptr, nullptr, nullptr);
2985 AioCompletion
*my_completion_null
= NULL
;
2986 ASSERT_NE(my_completion
, my_completion_null
);
2988 memset(buf
, 0xcc, sizeof(buf
));
2990 bl1
.append(buf
, sizeof(buf
));
2991 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
2992 bl1
, sizeof(buf
), 0));
2995 ASSERT_EQ(0, my_completion
->wait_for_complete());
2997 ASSERT_EQ(0, my_completion
->get_return_value());
2999 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3000 nullptr, nullptr, nullptr);
3001 ASSERT_NE(my_completion2
, my_completion_null
);
3002 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
3003 &bl2
, sizeof(buf
), 0));
3007 // Busy-wait until the AIO completes.
3008 // Normally we wouldn't do this, but we want to test is_complete.
3010 int is_complete
= my_completion2
->is_complete();
3015 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
3016 ASSERT_EQ(sizeof(buf
), bl2
.length());
3017 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
3018 delete my_completion
;
3019 delete my_completion2
;
3022 TEST(LibRadosAioEC
, IsSafe
) {
3023 AioTestDataEC test_data
;
3024 rados_completion_t my_completion
;
3025 ASSERT_EQ("", test_data
.init());
3026 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3027 nullptr, nullptr, &my_completion
));
3029 memset(buf
, 0xcc, sizeof(buf
));
3030 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3031 my_completion
, buf
, sizeof(buf
), 0));
3035 // Busy-wait until the AIO completes.
3036 // Normally we wouldn't do this, but we want to test rados_aio_is_safe.
3038 int is_safe
= rados_aio_is_safe(my_completion
);
3043 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3045 memset(buf2
, 0, sizeof(buf2
));
3046 rados_completion_t my_completion2
;
3047 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3048 nullptr, nullptr, &my_completion2
));
3049 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
3050 my_completion2
, buf2
, sizeof(buf2
), 0));
3053 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3055 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion2
));
3056 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
3057 rados_aio_release(my_completion
);
3058 rados_aio_release(my_completion2
);
3061 TEST(LibRadosAioEC
, IsSafePP
) {
3062 AioTestDataECPP test_data
;
3063 ASSERT_EQ("", test_data
.init());
3064 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3065 nullptr, nullptr, nullptr);
3066 AioCompletion
*my_completion_null
= NULL
;
3067 ASSERT_NE(my_completion
, my_completion_null
);
3069 memset(buf
, 0xcc, sizeof(buf
));
3071 bl1
.append(buf
, sizeof(buf
));
3072 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3073 bl1
, sizeof(buf
), 0));
3077 // Busy-wait until the AIO completes.
3078 // Normally we wouldn't do this, but we want to test rados_aio_is_safe.
3080 int is_safe
= my_completion
->is_safe();
3085 ASSERT_EQ(0, my_completion
->get_return_value());
3086 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3087 nullptr, nullptr, nullptr);
3089 ASSERT_NE(my_completion2
, my_completion_null
);
3090 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
3091 &bl2
, sizeof(buf
), 0));
3094 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3096 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
3097 ASSERT_EQ(sizeof(buf
), bl2
.length());
3098 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
3099 delete my_completion
;
3100 delete my_completion2
;
3103 TEST(LibRadosAioEC
, ReturnValue
) {
3104 AioTestDataEC test_data
;
3105 rados_completion_t my_completion
;
3106 ASSERT_EQ("", test_data
.init());
3107 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3108 nullptr, nullptr, &my_completion
));
3110 memset(buf
, 0, sizeof(buf
));
3111 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "nonexistent",
3112 my_completion
, buf
, sizeof(buf
), 0));
3115 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3117 ASSERT_EQ(-ENOENT
, rados_aio_get_return_value(my_completion
));
3118 rados_aio_release(my_completion
);
3121 TEST(LibRadosAioEC
, ReturnValuePP
) {
3122 AioTestDataECPP test_data
;
3123 ASSERT_EQ("", test_data
.init());
3124 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3125 nullptr, nullptr, nullptr);
3126 AioCompletion
*my_completion_null
= NULL
;
3127 ASSERT_NE(my_completion
, my_completion_null
);
3129 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("nonexistent",
3130 my_completion
, &bl1
, 128, 0));
3133 ASSERT_EQ(0, my_completion
->wait_for_complete());
3135 ASSERT_EQ(-ENOENT
, my_completion
->get_return_value());
3136 delete my_completion
;
3139 TEST(LibRadosAioEC
, Flush
) {
3140 AioTestDataEC test_data
;
3141 rados_completion_t my_completion
;
3142 ASSERT_EQ("", test_data
.init());
3143 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3144 nullptr, nullptr, &my_completion
));
3146 memset(buf
, 0xee, sizeof(buf
));
3147 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3148 my_completion
, buf
, sizeof(buf
), 0));
3149 ASSERT_EQ(0, rados_aio_flush(test_data
.m_ioctx
));
3150 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3152 memset(buf2
, 0, sizeof(buf2
));
3153 rados_completion_t my_completion2
;
3154 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3155 nullptr, nullptr, &my_completion2
));
3156 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
3157 my_completion2
, buf2
, sizeof(buf2
), 0));
3160 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3162 ASSERT_EQ((int)sizeof(buf2
), rados_aio_get_return_value(my_completion2
));
3163 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
3164 rados_aio_release(my_completion
);
3165 rados_aio_release(my_completion2
);
3168 TEST(LibRadosAioEC
, FlushPP
) {
3169 AioTestDataECPP test_data
;
3170 ASSERT_EQ("", test_data
.init());
3171 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3172 nullptr, nullptr, nullptr);
3173 AioCompletion
*my_completion_null
= NULL
;
3174 ASSERT_NE(my_completion
, my_completion_null
);
3176 memset(buf
, 0xee, sizeof(buf
));
3178 bl1
.append(buf
, sizeof(buf
));
3179 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3180 bl1
, sizeof(buf
), 0));
3181 ASSERT_EQ(0, test_data
.m_ioctx
.aio_flush());
3182 ASSERT_EQ(0, my_completion
->get_return_value());
3184 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3185 nullptr, nullptr, nullptr);
3186 ASSERT_NE(my_completion2
, my_completion_null
);
3187 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
3188 &bl2
, sizeof(buf
), 0));
3191 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3193 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
3194 ASSERT_EQ(sizeof(buf
), bl2
.length());
3195 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
3196 delete my_completion
;
3197 delete my_completion2
;
3200 TEST(LibRadosAioEC
, FlushAsync
) {
3201 AioTestDataEC test_data
;
3202 rados_completion_t my_completion
;
3203 ASSERT_EQ("", test_data
.init());
3204 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3205 nullptr, nullptr, &my_completion
));
3206 rados_completion_t flush_completion
;
3207 ASSERT_EQ(0, rados_aio_create_completion(NULL
, NULL
, NULL
, &flush_completion
));
3209 memset(buf
, 0xee, sizeof(buf
));
3210 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3211 my_completion
, buf
, sizeof(buf
), 0));
3212 ASSERT_EQ(0, rados_aio_flush_async(test_data
.m_ioctx
, flush_completion
));
3215 ASSERT_EQ(0, rados_aio_wait_for_complete(flush_completion
));
3216 ASSERT_EQ(0, rados_aio_wait_for_safe(flush_completion
));
3218 ASSERT_EQ(1, rados_aio_is_complete(my_completion
));
3219 ASSERT_EQ(1, rados_aio_is_safe(my_completion
));
3220 ASSERT_EQ(1, rados_aio_is_complete(flush_completion
));
3221 ASSERT_EQ(1, rados_aio_is_safe(flush_completion
));
3222 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3224 memset(buf2
, 0, sizeof(buf2
));
3225 rados_completion_t my_completion2
;
3226 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3227 nullptr, nullptr, &my_completion2
));
3228 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
3229 my_completion2
, buf2
, sizeof(buf2
), 0));
3232 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3234 ASSERT_EQ((int)sizeof(buf2
), rados_aio_get_return_value(my_completion2
));
3235 ASSERT_EQ(0, memcmp(buf
, buf2
, sizeof(buf
)));
3236 rados_aio_release(my_completion
);
3237 rados_aio_release(my_completion2
);
3238 rados_aio_release(flush_completion
);
3241 TEST(LibRadosAioEC
, FlushAsyncPP
) {
3242 AioTestDataECPP test_data
;
3243 ASSERT_EQ("", test_data
.init());
3244 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3245 nullptr, nullptr, nullptr);
3246 AioCompletion
*flush_completion
=
3247 test_data
.m_cluster
.aio_create_completion(NULL
, NULL
, NULL
);
3248 AioCompletion
*my_completion_null
= NULL
;
3249 ASSERT_NE(my_completion
, my_completion_null
);
3251 memset(buf
, 0xee, sizeof(buf
));
3253 bl1
.append(buf
, sizeof(buf
));
3254 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3255 bl1
, sizeof(buf
), 0));
3256 ASSERT_EQ(0, test_data
.m_ioctx
.aio_flush_async(flush_completion
));
3259 ASSERT_EQ(0, flush_completion
->wait_for_complete());
3260 ASSERT_EQ(0, flush_completion
->wait_for_safe());
3262 ASSERT_EQ(1, my_completion
->is_complete());
3263 ASSERT_EQ(1, my_completion
->is_safe());
3264 ASSERT_EQ(1, flush_completion
->is_complete());
3265 ASSERT_EQ(1, flush_completion
->is_safe());
3266 ASSERT_EQ(0, my_completion
->get_return_value());
3268 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3269 nullptr, nullptr, nullptr);
3270 ASSERT_NE(my_completion2
, my_completion_null
);
3271 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion2
,
3272 &bl2
, sizeof(buf
), 0));
3275 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3277 ASSERT_EQ((int)sizeof(buf
), my_completion2
->get_return_value());
3278 ASSERT_EQ(sizeof(buf
), bl2
.length());
3279 ASSERT_EQ(0, memcmp(buf
, bl2
.c_str(), sizeof(buf
)));
3280 delete my_completion
;
3281 delete my_completion2
;
3282 delete flush_completion
;
3285 TEST(LibRadosAioEC
, RoundTripWriteFull
) {
3286 AioTestDataEC test_data
;
3287 rados_completion_t my_completion
, my_completion2
, my_completion3
;
3288 ASSERT_EQ("", test_data
.init());
3289 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3290 nullptr, nullptr, &my_completion
));
3292 memset(buf
, 0xcc, sizeof(buf
));
3293 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3294 my_completion
, buf
, sizeof(buf
), 0));
3297 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3299 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3301 memset(buf2
, 0xdd, sizeof(buf2
));
3302 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3303 nullptr, nullptr, &my_completion2
));
3304 ASSERT_EQ(0, rados_aio_write_full(test_data
.m_ioctx
, "foo",
3305 my_completion2
, buf2
, sizeof(buf2
)));
3308 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3310 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
3311 char buf3
[sizeof(buf
) + sizeof(buf2
)];
3312 memset(buf3
, 0, sizeof(buf3
));
3313 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3314 nullptr, nullptr, &my_completion3
));
3315 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
3316 my_completion3
, buf3
, sizeof(buf3
), 0));
3319 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
3321 ASSERT_EQ((int)sizeof(buf2
), rados_aio_get_return_value(my_completion3
));
3322 ASSERT_EQ(0, memcmp(buf3
, buf2
, sizeof(buf2
)));
3323 rados_aio_release(my_completion
);
3324 rados_aio_release(my_completion2
);
3325 rados_aio_release(my_completion3
);
3328 TEST(LibRadosAioEC
, RoundTripWriteFullPP
) {
3329 AioTestDataECPP test_data
;
3330 ASSERT_EQ("", test_data
.init());
3331 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3332 nullptr, nullptr, nullptr);
3333 AioCompletion
*my_completion_null
= NULL
;
3334 ASSERT_NE(my_completion
, my_completion_null
);
3336 memset(buf
, 0xcc, sizeof(buf
));
3338 bl1
.append(buf
, sizeof(buf
));
3339 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3340 bl1
, sizeof(buf
), 0));
3343 ASSERT_EQ(0, my_completion
->wait_for_complete());
3345 ASSERT_EQ(0, my_completion
->get_return_value());
3347 memset(buf2
, 0xdd, sizeof(buf2
));
3349 bl2
.append(buf2
, sizeof(buf2
));
3350 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3351 nullptr, nullptr, nullptr);
3352 ASSERT_NE(my_completion2
, my_completion_null
);
3353 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write_full("foo", my_completion2
, bl2
));
3356 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3358 ASSERT_EQ(0, my_completion2
->get_return_value());
3360 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
3361 nullptr, nullptr, nullptr);
3362 ASSERT_NE(my_completion3
, my_completion_null
);
3363 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion3
,
3364 &bl3
, sizeof(buf
), 0));
3367 ASSERT_EQ(0, my_completion3
->wait_for_complete());
3369 ASSERT_EQ((int)sizeof(buf2
), my_completion3
->get_return_value());
3370 ASSERT_EQ(sizeof(buf2
), bl3
.length());
3371 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf2
, sizeof(buf2
)));
3372 delete my_completion
;
3373 delete my_completion2
;
3374 delete my_completion3
;
3377 //using ObjectWriteOperation/ObjectReadOperation with iohint
3378 TEST(LibRadosAioEC
, RoundTripWriteFullPP2
)
3381 std::string pool_name
= get_temp_pool_name();
3382 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
3384 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
3386 boost::scoped_ptr
<AioCompletion
> my_completion1(cluster
.aio_create_completion(0, 0, 0));
3387 ObjectWriteOperation op
;
3389 memset(buf
, 0xcc, sizeof(buf
));
3394 op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOCACHE
);
3395 ioctx
.aio_operate("test_obj", my_completion1
.get(), &op
);
3398 ASSERT_EQ(0, my_completion1
->wait_for_complete());
3400 EXPECT_EQ(0, my_completion1
->get_return_value());
3402 boost::scoped_ptr
<AioCompletion
> my_completion2(cluster
.aio_create_completion(0, 0, 0));
3404 ObjectReadOperation op1
;
3405 op1
.read(0, sizeof(buf
), &bl
, NULL
);
3406 op1
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOCACHE
|LIBRADOS_OP_FLAG_FADVISE_RANDOM
);
3407 ioctx
.aio_operate("test_obj", my_completion2
.get(), &op1
, 0);
3410 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3412 EXPECT_EQ(0, my_completion2
->get_return_value());
3413 ASSERT_EQ(0, memcmp(buf
, bl
.c_str(), sizeof(buf
)));
3415 ioctx
.remove("test_obj");
3416 destroy_one_pool_pp(pool_name
, cluster
);
3419 TEST(LibRadosAioEC
, SimpleStat
) {
3420 AioTestDataEC test_data
;
3421 rados_completion_t my_completion
;
3422 ASSERT_EQ("", test_data
.init());
3423 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3424 nullptr, nullptr, &my_completion
));
3426 memset(buf
, 0xcc, sizeof(buf
));
3427 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3428 my_completion
, buf
, sizeof(buf
), 0));
3431 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3433 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3436 rados_completion_t my_completion2
;
3437 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3438 nullptr, nullptr, &my_completion2
));
3439 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
3440 my_completion2
, &psize
, &pmtime
));
3443 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3445 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
3446 ASSERT_EQ(sizeof(buf
), psize
);
3447 rados_aio_release(my_completion
);
3448 rados_aio_release(my_completion2
);
3451 TEST(LibRadosAioEC
, SimpleStatPP
) {
3452 AioTestDataECPP test_data
;
3453 ASSERT_EQ("", test_data
.init());
3454 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3455 nullptr, nullptr, nullptr);
3456 AioCompletion
*my_completion_null
= NULL
;
3457 ASSERT_NE(my_completion
, my_completion_null
);
3459 memset(buf
, 0xcc, sizeof(buf
));
3461 bl1
.append(buf
, sizeof(buf
));
3462 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3463 bl1
, sizeof(buf
), 0));
3466 ASSERT_EQ(0, my_completion
->wait_for_complete());
3468 ASSERT_EQ(0, my_completion
->get_return_value());
3471 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3472 nullptr, nullptr, nullptr);
3473 ASSERT_NE(my_completion2
, my_completion_null
);
3474 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion2
,
3478 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3480 ASSERT_EQ(0, my_completion2
->get_return_value());
3481 ASSERT_EQ(sizeof(buf
), psize
);
3482 delete my_completion
;
3483 delete my_completion2
;
3486 TEST(LibRadosAioEC
, SimpleStatNS
) {
3487 AioTestDataEC test_data
;
3488 rados_completion_t my_completion
;
3489 ASSERT_EQ("", test_data
.init());
3490 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3491 nullptr, nullptr, &my_completion
));
3493 memset(buf
, 0xcc, sizeof(buf
));
3494 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3495 my_completion
, buf
, sizeof(buf
), 0));
3498 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3500 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3501 rados_ioctx_set_namespace(test_data
.m_ioctx
, "nspace");
3503 memset(buf2
, 0xbb, sizeof(buf2
));
3504 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3505 nullptr, nullptr, &my_completion
));
3506 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3507 my_completion
, buf2
, sizeof(buf2
), 0));
3510 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3512 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3515 rados_completion_t my_completion2
;
3516 rados_ioctx_set_namespace(test_data
.m_ioctx
, "");
3517 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3518 nullptr, nullptr, &my_completion2
));
3519 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
3520 my_completion2
, &psize
, &pmtime
));
3523 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3525 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
3526 ASSERT_EQ(sizeof(buf
), psize
);
3528 rados_ioctx_set_namespace(test_data
.m_ioctx
, "nspace");
3529 rados_completion_t my_completion3
;
3530 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3531 nullptr, nullptr, &my_completion3
));
3532 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
3533 my_completion3
, &psize
, &pmtime
));
3536 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
3538 ASSERT_EQ(0, rados_aio_get_return_value(my_completion3
));
3539 ASSERT_EQ(sizeof(buf2
), psize
);
3541 rados_aio_release(my_completion
);
3542 rados_aio_release(my_completion2
);
3543 rados_aio_release(my_completion3
);
3546 TEST(LibRadosAioEC
, SimpleStatPPNS
) {
3547 AioTestDataECPP test_data
;
3548 ASSERT_EQ("", test_data
.init());
3549 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3550 nullptr, nullptr, nullptr);
3551 AioCompletion
*my_completion_null
= NULL
;
3552 ASSERT_NE(my_completion
, my_completion_null
);
3554 memset(buf
, 0xcc, sizeof(buf
));
3556 bl1
.append(buf
, sizeof(buf
));
3557 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3558 bl1
, sizeof(buf
), 0));
3561 ASSERT_EQ(0, my_completion
->wait_for_complete());
3563 ASSERT_EQ(0, my_completion
->get_return_value());
3566 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3567 nullptr, nullptr, nullptr);
3568 ASSERT_NE(my_completion2
, my_completion_null
);
3569 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion2
,
3573 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3575 ASSERT_EQ(0, my_completion2
->get_return_value());
3576 ASSERT_EQ(sizeof(buf
), psize
);
3577 delete my_completion
;
3578 delete my_completion2
;
3581 TEST(LibRadosAioEC
, StatRemove
) {
3582 AioTestDataEC test_data
;
3583 rados_completion_t my_completion
;
3584 ASSERT_EQ("", test_data
.init());
3585 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3586 nullptr, nullptr, &my_completion
));
3588 memset(buf
, 0xcc, sizeof(buf
));
3589 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3590 my_completion
, buf
, sizeof(buf
), 0));
3593 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3595 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3598 rados_completion_t my_completion2
;
3599 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3600 nullptr, nullptr, &my_completion2
));
3601 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
3602 my_completion2
, &psize
, &pmtime
));
3605 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3607 ASSERT_EQ(0, rados_aio_get_return_value(my_completion2
));
3608 ASSERT_EQ(sizeof(buf
), psize
);
3609 rados_completion_t my_completion3
;
3610 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3611 nullptr, nullptr, &my_completion3
));
3612 ASSERT_EQ(0, rados_aio_remove(test_data
.m_ioctx
, "foo", my_completion3
));
3615 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
3617 ASSERT_EQ(0, rados_aio_get_return_value(my_completion3
));
3620 rados_completion_t my_completion4
;
3621 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3622 nullptr, nullptr, &my_completion4
));
3623 ASSERT_EQ(0, rados_aio_stat(test_data
.m_ioctx
, "foo",
3624 my_completion4
, &psize2
, &pmtime2
));
3627 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion4
));
3629 ASSERT_EQ(-ENOENT
, rados_aio_get_return_value(my_completion4
));
3630 rados_aio_release(my_completion
);
3631 rados_aio_release(my_completion2
);
3632 rados_aio_release(my_completion3
);
3633 rados_aio_release(my_completion4
);
3636 TEST(LibRadosAioEC
, StatRemovePP
) {
3637 AioTestDataECPP test_data
;
3638 ASSERT_EQ("", test_data
.init());
3639 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3640 nullptr, nullptr, nullptr);
3641 AioCompletion
*my_completion_null
= NULL
;
3642 ASSERT_NE(my_completion
, my_completion_null
);
3644 memset(buf
, 0xcc, sizeof(buf
));
3646 bl1
.append(buf
, sizeof(buf
));
3647 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3648 bl1
, sizeof(buf
), 0));
3651 ASSERT_EQ(0, my_completion
->wait_for_complete());
3653 ASSERT_EQ(0, my_completion
->get_return_value());
3656 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3657 nullptr, nullptr, nullptr);
3658 ASSERT_NE(my_completion2
, my_completion_null
);
3659 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion2
,
3663 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3665 ASSERT_EQ(0, my_completion2
->get_return_value());
3666 ASSERT_EQ(sizeof(buf
), psize
);
3669 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
3670 nullptr, nullptr, nullptr);
3671 ASSERT_NE(my_completion3
, my_completion_null
);
3672 ASSERT_EQ(0, test_data
.m_ioctx
.aio_remove("foo", my_completion3
));
3675 ASSERT_EQ(0, my_completion3
->wait_for_complete());
3677 ASSERT_EQ(0, my_completion3
->get_return_value());
3679 AioCompletion
*my_completion4
= test_data
.m_cluster
.aio_create_completion(
3680 nullptr, nullptr, nullptr);
3681 ASSERT_NE(my_completion4
, my_completion_null
);
3682 ASSERT_EQ(0, test_data
.m_ioctx
.aio_stat("foo", my_completion4
,
3683 &psize2
, &pmtime2
));
3686 ASSERT_EQ(0, my_completion4
->wait_for_complete());
3688 ASSERT_EQ(-ENOENT
, my_completion4
->get_return_value());
3689 delete my_completion
;
3690 delete my_completion2
;
3691 delete my_completion3
;
3692 delete my_completion4
;
3695 TEST(LibRadosAioEC
, ExecuteClass
) {
3696 AioTestDataEC test_data
;
3697 rados_completion_t my_completion
;
3698 ASSERT_EQ("", test_data
.init());
3699 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3700 nullptr, nullptr, &my_completion
));
3702 memset(buf
, 0xcc, sizeof(buf
));
3703 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3704 my_completion
, buf
, sizeof(buf
), 0));
3707 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3709 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3710 rados_completion_t my_completion2
;
3711 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3712 nullptr, nullptr, &my_completion2
));
3714 ASSERT_EQ(0, rados_aio_exec(test_data
.m_ioctx
, "foo", my_completion2
,
3715 "hello", "say_hello", NULL
, 0, out
, sizeof(out
)));
3718 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3720 ASSERT_EQ(13, rados_aio_get_return_value(my_completion2
));
3721 ASSERT_EQ(0, strncmp("Hello, world!", out
, 13));
3722 rados_aio_release(my_completion
);
3723 rados_aio_release(my_completion2
);
3726 TEST(LibRadosAioEC
, ExecuteClassPP
) {
3727 AioTestDataECPP test_data
;
3728 ASSERT_EQ("", test_data
.init());
3729 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3730 nullptr, nullptr, nullptr);
3731 AioCompletion
*my_completion_null
= NULL
;
3732 ASSERT_NE(my_completion
, my_completion_null
);
3734 memset(buf
, 0xcc, sizeof(buf
));
3736 bl1
.append(buf
, sizeof(buf
));
3737 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3738 bl1
, sizeof(buf
), 0));
3741 ASSERT_EQ(0, my_completion
->wait_for_complete());
3743 ASSERT_EQ(0, my_completion
->get_return_value());
3744 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3745 nullptr, nullptr, nullptr);
3746 ASSERT_NE(my_completion2
, my_completion_null
);
3748 ASSERT_EQ(0, test_data
.m_ioctx
.aio_exec("foo", my_completion2
,
3749 "hello", "say_hello", in
, &out
));
3752 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3754 ASSERT_EQ(0, my_completion2
->get_return_value());
3755 ASSERT_EQ(std::string("Hello, world!"), std::string(out
.c_str(), out
.length()));
3756 delete my_completion
;
3757 delete my_completion2
;
3760 TEST(LibRadosAioEC
, OmapPP
) {
3762 std::string pool_name
= get_temp_pool_name();
3763 ASSERT_EQ("", create_one_ec_pool_pp(pool_name
, cluster
));
3765 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
3767 string header_str
= "baz";
3768 bufferptr
bp(header_str
.c_str(), header_str
.size() + 1);
3769 bufferlist header_to_set
;
3770 header_to_set
.push_back(bp
);
3771 map
<string
, bufferlist
> to_set
;
3773 boost::scoped_ptr
<AioCompletion
> my_completion(cluster
.aio_create_completion(0, 0, 0));
3774 ObjectWriteOperation op
;
3775 to_set
["foo"] = header_to_set
;
3776 to_set
["foo2"] = header_to_set
;
3777 to_set
["qfoo3"] = header_to_set
;
3778 op
.omap_set(to_set
);
3780 op
.omap_set_header(header_to_set
);
3782 ioctx
.aio_operate("test_obj", my_completion
.get(), &op
);
3785 ASSERT_EQ(0, my_completion
->wait_for_complete());
3787 EXPECT_EQ(-EOPNOTSUPP
, my_completion
->get_return_value());
3789 ioctx
.remove("test_obj");
3790 destroy_one_pool_pp(pool_name
, cluster
);
3793 TEST(LibRadosAioEC
, MultiWrite
) {
3794 AioTestDataEC test_data
;
3795 rados_completion_t my_completion
, my_completion2
, my_completion3
;
3796 ASSERT_EQ("", test_data
.init());
3797 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3798 nullptr, nullptr, &my_completion
));
3800 memset(buf
, 0xcc, sizeof(buf
));
3801 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3802 my_completion
, buf
, sizeof(buf
), 0));
3805 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion
));
3807 ASSERT_EQ(0, rados_aio_get_return_value(my_completion
));
3810 memset(buf2
, 0xdd, sizeof(buf2
));
3811 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3812 nullptr, nullptr, &my_completion2
));
3813 ASSERT_EQ(0, rados_aio_write(test_data
.m_ioctx
, "foo",
3814 my_completion2
, buf2
, sizeof(buf2
), sizeof(buf
)));
3817 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2
));
3819 ASSERT_EQ(-EOPNOTSUPP
, rados_aio_get_return_value(my_completion2
));
3821 char buf3
[(sizeof(buf
) + sizeof(buf2
)) * 3];
3822 memset(buf3
, 0, sizeof(buf3
));
3823 ASSERT_EQ(0, rados_aio_create_completion(nullptr,
3824 nullptr, nullptr, &my_completion3
));
3825 ASSERT_EQ(0, rados_aio_read(test_data
.m_ioctx
, "foo",
3826 my_completion3
, buf3
, sizeof(buf3
), 0));
3829 ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion3
));
3831 ASSERT_EQ((int)sizeof(buf
), rados_aio_get_return_value(my_completion3
));
3832 ASSERT_EQ(0, memcmp(buf3
, buf
, sizeof(buf
)));
3833 rados_aio_release(my_completion
);
3834 rados_aio_release(my_completion2
);
3835 rados_aio_release(my_completion3
);
3838 TEST(LibRadosAioEC
, MultiWritePP
) {
3839 AioTestDataECPP test_data
;
3840 ASSERT_EQ("", test_data
.init());
3841 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3842 nullptr, nullptr, nullptr);
3843 AioCompletion
*my_completion_null
= NULL
;
3844 ASSERT_NE(my_completion
, my_completion_null
);
3846 memset(buf
, 0xcc, sizeof(buf
));
3848 bl1
.append(buf
, sizeof(buf
));
3849 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3850 bl1
, sizeof(buf
), 0));
3853 ASSERT_EQ(0, my_completion
->wait_for_complete());
3855 ASSERT_EQ(0, my_completion
->get_return_value());
3858 memset(buf2
, 0xdd, sizeof(buf2
));
3860 bl2
.append(buf2
, sizeof(buf2
));
3861 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3862 nullptr, nullptr, nullptr);
3863 ASSERT_NE(my_completion2
, my_completion_null
);
3864 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion2
,
3865 bl2
, sizeof(buf2
), sizeof(buf
)));
3868 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3870 ASSERT_EQ(-EOPNOTSUPP
, my_completion2
->get_return_value());
3873 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
3874 nullptr, nullptr, nullptr);
3875 ASSERT_NE(my_completion3
, my_completion_null
);
3876 ASSERT_EQ(0, test_data
.m_ioctx
.aio_read("foo", my_completion3
,
3877 &bl3
, (sizeof(buf
) + sizeof(buf2
) * 3), 0));
3880 ASSERT_EQ(0, my_completion3
->wait_for_complete());
3882 ASSERT_EQ((int)sizeof(buf
), my_completion3
->get_return_value());
3883 ASSERT_EQ(sizeof(buf
), bl3
.length());
3884 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf
, sizeof(buf
)));
3885 delete my_completion
;
3886 delete my_completion2
;
3887 delete my_completion3
;
3890 TEST(LibRadosAio
, RacingRemovePP
) {
3891 AioTestDataPP test_data
;
3892 ASSERT_EQ("", test_data
.init({{"objecter_retry_writes_after_first_reply", "true"}}));
3893 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3894 nullptr, nullptr, nullptr);
3895 ASSERT_NE(my_completion
, nullptr);
3897 memset(buf
, 0xcc, sizeof(buf
));
3899 bl
.append(buf
, sizeof(buf
));
3900 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3901 nullptr, nullptr, nullptr);
3902 ASSERT_NE(my_completion2
, nullptr);
3903 ASSERT_EQ(0, test_data
.m_ioctx
.aio_remove("foo", my_completion2
));
3904 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3905 bl
, sizeof(buf
), 0));
3908 my_completion2
->wait_for_complete();
3909 my_completion
->wait_for_complete();
3911 ASSERT_EQ(-ENOENT
, my_completion2
->get_return_value());
3912 ASSERT_EQ(0, my_completion
->get_return_value());
3913 ASSERT_EQ(0, test_data
.m_ioctx
.stat("foo", nullptr, nullptr));
3914 delete my_completion
;
3915 delete my_completion2
;
3918 TEST(LibRadosAio
, RoundTripCmpExtPP
) {
3919 AioTestDataPP test_data
;
3920 ASSERT_EQ("", test_data
.init());
3921 AioCompletion
*my_completion
= test_data
.m_cluster
.aio_create_completion(
3922 nullptr, nullptr, nullptr);
3923 AioCompletion
*my_completion_null
= NULL
;
3924 ASSERT_NE(my_completion
, my_completion_null
);
3926 memset(full
, 0xcc, sizeof(full
));
3928 bl1
.append(full
, sizeof(full
));
3929 ASSERT_EQ(0, test_data
.m_ioctx
.aio_write("foo", my_completion
,
3930 bl1
, sizeof(full
), 0));
3933 ASSERT_EQ(0, my_completion
->wait_for_complete());
3935 ASSERT_EQ(0, my_completion
->get_return_value());
3937 /* compare with match */
3939 cbl
.append(full
, sizeof(full
));
3940 AioCompletion
*my_completion2
= test_data
.m_cluster
.aio_create_completion(
3941 nullptr, nullptr, nullptr);
3942 ASSERT_EQ(0, test_data
.m_ioctx
.aio_cmpext("foo", my_completion2
, 0, cbl
));
3946 ASSERT_EQ(0, my_completion2
->wait_for_complete());
3948 ASSERT_EQ(0, my_completion2
->get_return_value());
3950 /* compare with mismatch */
3951 memset(full
, 0xdd, sizeof(full
));
3953 cbl
.append(full
, sizeof(full
));
3954 AioCompletion
*my_completion3
= test_data
.m_cluster
.aio_create_completion(
3955 nullptr, nullptr, nullptr);
3956 ASSERT_EQ(0, test_data
.m_ioctx
.aio_cmpext("foo", my_completion3
, 0, cbl
));
3960 ASSERT_EQ(0, my_completion3
->wait_for_complete());
3962 ASSERT_EQ(-MAX_ERRNO
, my_completion3
->get_return_value());
3964 delete my_completion
;
3965 delete my_completion2
;
3966 delete my_completion3
;
3969 TEST(LibRadosAio
, RoundTripCmpExtPP2
)
3973 char miscmp_buf
[128];
3976 std::string pool_name
= get_temp_pool_name();
3977 ASSERT_EQ("", create_one_pool_pp(pool_name
, cluster
));
3979 cluster
.ioctx_create(pool_name
.c_str(), ioctx
);
3981 boost::scoped_ptr
<AioCompletion
>
3982 wr_cmpl(cluster
.aio_create_completion(0, 0, 0));
3983 ObjectWriteOperation wr_op
;
3984 memset(buf
, 0xcc, sizeof(buf
));
3985 memset(miscmp_buf
, 0xdd, sizeof(miscmp_buf
));
3987 bl
.append(buf
, sizeof(buf
));
3989 wr_op
.write_full(bl
);
3990 wr_op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
3991 ioctx
.aio_operate("test_obj", wr_cmpl
.get(), &wr_op
);
3994 ASSERT_EQ(0, wr_cmpl
->wait_for_complete());
3996 EXPECT_EQ(0, wr_cmpl
->get_return_value());
3998 /* cmpext as write op. first match then mismatch */
3999 boost::scoped_ptr
<AioCompletion
>
4000 wr_cmpext_cmpl(cluster
.aio_create_completion(0, 0, 0));
4001 cbl
.append(buf
, sizeof(buf
));
4004 wr_op
.cmpext(0, cbl
, &ret
);
4005 wr_op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
4006 ioctx
.aio_operate("test_obj", wr_cmpext_cmpl
.get(), &wr_op
);
4009 ASSERT_EQ(0, wr_cmpext_cmpl
->wait_for_complete());
4011 EXPECT_EQ(0, wr_cmpext_cmpl
->get_return_value());
4014 boost::scoped_ptr
<AioCompletion
>
4015 wr_cmpext_cmpl2(cluster
.aio_create_completion(0, 0, 0));
4017 cbl
.append(miscmp_buf
, sizeof(miscmp_buf
));
4020 wr_op
.cmpext(0, cbl
, &ret
);
4021 wr_op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
4022 ioctx
.aio_operate("test_obj", wr_cmpext_cmpl2
.get(), &wr_op
);
4025 ASSERT_EQ(0, wr_cmpext_cmpl2
->wait_for_complete());
4027 EXPECT_EQ(-MAX_ERRNO
, wr_cmpext_cmpl2
->get_return_value());
4028 EXPECT_EQ(-MAX_ERRNO
, ret
);
4030 /* cmpext as read op */
4031 boost::scoped_ptr
<AioCompletion
>
4032 rd_cmpext_cmpl(cluster
.aio_create_completion(0, 0, 0));
4033 ObjectReadOperation rd_op
;
4035 cbl
.append(buf
, sizeof(buf
));
4037 rd_op
.cmpext(0, cbl
, &ret
);
4038 rd_op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
4039 ioctx
.aio_operate("test_obj", rd_cmpext_cmpl
.get(), &rd_op
, 0);
4042 ASSERT_EQ(0, rd_cmpext_cmpl
->wait_for_complete());
4044 EXPECT_EQ(0, rd_cmpext_cmpl
->get_return_value());
4047 boost::scoped_ptr
<AioCompletion
>
4048 rd_cmpext_cmpl2(cluster
.aio_create_completion(0, 0, 0));
4050 cbl
.append(miscmp_buf
, sizeof(miscmp_buf
));
4053 rd_op
.cmpext(0, cbl
, &ret
);
4054 rd_op
.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED
);
4055 ioctx
.aio_operate("test_obj", rd_cmpext_cmpl2
.get(), &rd_op
, 0);
4058 ASSERT_EQ(0, rd_cmpext_cmpl2
->wait_for_complete());
4060 EXPECT_EQ(-MAX_ERRNO
, rd_cmpext_cmpl2
->get_return_value());
4061 EXPECT_EQ(-MAX_ERRNO
, ret
);
4063 ioctx
.remove("test_obj");
4064 destroy_one_pool_pp(pool_name
, cluster
);