From c5fd5640879ab0fed0e3ac0009bb37dec43f7ad1 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 2 Jun 2015 10:33:35 -0400 Subject: [PATCH 22/22] tests: verify librbd blocking aio code path Signed-off-by: Jason Dillaman (cherry picked from commit 4cf41486e9c9e1efcb863960a8f3e0326ffca7e5) (cherry picked from commit 0e668f6a278bf4d2c7a80dc7a30325e1c1645ce0) Conflicts: src/test/librbd/test_librbd.cc: removed refs to pending AIO --- src/test/librbd/test_librbd.cc | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index a903dd2..0f3e857 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -1867,6 +1867,65 @@ TEST(LibRBD, ZeroLengthRead) ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } +TEST(LibRBD, BlockingAIO) +{ + librados::Rados rados; + librados::IoCtx ioctx; + string pool_name = get_temp_pool_name(); + + ASSERT_EQ("", create_one_pool_pp(pool_name, rados)); + ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx)); + + librbd::RBD rbd; + std::string name = "testimg"; + uint64_t size = 1 << 20; + int order = 18; + ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order)); + + CephContext *cct = reinterpret_cast(ioctx.cct()); + cct->_conf->set_val_or_die("rbd_non_blocking_aio", "0"); + + librbd::Image image; + ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL)); + + bufferlist bl; + bl.append(std::string(256, '1')); + + librbd::RBD::AioCompletion *write_comp = + new librbd::RBD::AioCompletion(NULL, NULL); + ASSERT_EQ(0, image.aio_write(0, bl.length(), bl, write_comp)); + + librbd::RBD::AioCompletion *flush_comp = + new librbd::RBD::AioCompletion(NULL, NULL); + ASSERT_EQ(0, image.aio_flush(flush_comp)); + ASSERT_EQ(0, flush_comp->wait_for_complete()); + ASSERT_EQ(0, flush_comp->get_return_value()); + flush_comp->release(); + + ASSERT_EQ(1, write_comp->is_complete()); + ASSERT_EQ(0, write_comp->get_return_value()); + write_comp->release(); + + librbd::RBD::AioCompletion *discard_comp = + new librbd::RBD::AioCompletion(NULL, NULL); + ASSERT_EQ(0, image.aio_discard(128, 128, discard_comp)); + ASSERT_EQ(0, discard_comp->wait_for_complete()); + discard_comp->release(); + + librbd::RBD::AioCompletion *read_comp = + new librbd::RBD::AioCompletion(NULL, NULL); + bufferlist read_bl; + image.aio_read(0, bl.length(), read_bl, read_comp); + ASSERT_EQ(0, read_comp->wait_for_complete()); + ASSERT_EQ(bl.length(), read_comp->get_return_value()); + read_comp->release(); + + bufferlist expected_bl; + expected_bl.append(std::string(128, '1')); + expected_bl.append(std::string(128, '\0')); + ASSERT_TRUE(expected_bl.contents_equal(read_bl)); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); -- 2.1.0