From: Casey Bodley Date: Fri, 25 Oct 2024 15:38:12 +0000 (-0400) Subject: test/librados/asio: add test cases for deferred X-Git-Tag: v20.0.0~225^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F60576%2Fhead;p=ceph.git test/librados/asio: add test cases for deferred Signed-off-by: Casey Bodley --- diff --git a/src/test/librados/asio.cc b/src/test/librados/asio.cc index 9867782efa3..384498fd1c4 100644 --- a/src/test/librados/asio.cc +++ b/src/test/librados/asio.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -114,6 +115,36 @@ TEST_F(AsioRados, AsyncReadCallback) service.run(); } +TEST_F(AsioRados, AsyncReadDeferred) +{ + boost::asio::io_context service; + auto ex = service.get_executor(); + + auto init1 = [&] { // pass local variables that go out of scope + librados::IoCtx ioc = io; + std::string oid = "exist"; + return librados::async_read(ex, ioc, oid, 256, 0, boost::asio::deferred); + }(); + std::move(init1)([] (error_code ec, version_t ver, bufferlist bl) { + EXPECT_FALSE(ec); + EXPECT_LT(0, ver); + EXPECT_EQ("hello", bl.to_str()); + }); + + auto init2 = [&] { + librados::IoCtx ioc = io; + std::string oid = "noexist"; + return librados::async_read(ex, ioc, oid, 256, 0, boost::asio::deferred); + }(); + std::move(init2)([] (error_code ec, version_t ver, bufferlist bl) { + EXPECT_EQ(boost::system::errc::no_such_file_or_directory, ec); + EXPECT_EQ(0, ver); + EXPECT_EQ(0, bl.length()); + }); + + service.run(); +} + TEST_F(AsioRados, AsyncReadFuture) { boost::asio::io_context service; @@ -237,6 +268,40 @@ TEST_F(AsioRados, AsyncWriteCallback) service.run(); } +TEST_F(AsioRados, AsyncWriteDeferred) +{ + boost::asio::io_context service; + auto ex = service.get_executor(); + + auto init1 = [&] { // pass local variables that go out of scope + librados::IoCtx ioc = io; + std::string oid = "exist"; + bufferlist bl; + bl.append("hello"); + return librados::async_write(ex, ioc, oid, bl, bl.length(), 0, + boost::asio::deferred); + }(); + std::move(init1)([] (error_code ec, version_t ver) { + EXPECT_FALSE(ec); + EXPECT_LT(0, ver); + }); + + auto init2 = [&] { + librados::IoCtx ioc = snapio; + std::string oid = "exist"; + bufferlist bl; + bl.append("hello"); + return librados::async_write(ex, ioc, oid, bl, bl.length(), 0, + boost::asio::deferred); + }(); + std::move(init2)([] (error_code ec, version_t ver) { + EXPECT_EQ(boost::system::errc::read_only_file_system, ec); + EXPECT_EQ(0, ver); + }); + + service.run(); +} + TEST_F(AsioRados, AsyncWriteFuture) { boost::asio::io_context service; @@ -360,6 +425,42 @@ TEST_F(AsioRados, AsyncReadOperationCallback) service.run(); } +TEST_F(AsioRados, AsyncReadOperationDeferred) +{ + boost::asio::io_context service; + auto ex = service.get_executor(); + + auto init1 = [&] { // pass local variables that go out of scope + librados::IoCtx ioc = io; + std::string oid = "exist"; + librados::ObjectReadOperation op; + op.read(0, 0, nullptr, nullptr); + return librados::async_operate(ex, ioc, oid, std::move(op), + 0, nullptr, boost::asio::deferred); + }(); + std::move(init1)([] (error_code ec, version_t ver, bufferlist bl) { + EXPECT_FALSE(ec); + EXPECT_LT(0, ver); + EXPECT_EQ("hello", bl.to_str()); + }); + + auto init2 = [&] { + librados::IoCtx ioc = io; + std::string oid = "noexist"; + librados::ObjectReadOperation op; + op.read(0, 0, nullptr, nullptr); + return librados::async_operate(ex, ioc, oid, std::move(op), + 0, nullptr, boost::asio::deferred); + }(); + std::move(init2)([] (error_code ec, version_t ver, bufferlist bl) { + EXPECT_EQ(boost::system::errc::no_such_file_or_directory, ec); + EXPECT_EQ(0, ver); + EXPECT_EQ(0, bl.length()); + }); + + service.run(); +} + TEST_F(AsioRados, AsyncReadOperationFuture) { boost::asio::io_context service; @@ -500,6 +601,44 @@ TEST_F(AsioRados, AsyncWriteOperationCallback) service.run(); } +TEST_F(AsioRados, AsyncWriteOperationDeferred) +{ + boost::asio::io_context service; + auto ex = service.get_executor(); + + auto init1 = [&] { // pass local variables that go out of scope + librados::IoCtx ioc = io; + std::string oid = "exist"; + bufferlist bl; + bl.append("hello"); + librados::ObjectWriteOperation op; + op.write_full(bl); + return librados::async_operate(ex, ioc, oid, std::move(op), + 0, nullptr, boost::asio::deferred); + }(); + std::move(init1)([] (error_code ec, version_t ver) { + EXPECT_FALSE(ec); + EXPECT_LT(0, ver); + }); + + auto init2 = [&] { + librados::IoCtx ioc = snapio; + std::string oid = "exist"; + bufferlist bl; + bl.append("hello"); + librados::ObjectWriteOperation op; + op.write_full(bl); + return librados::async_operate(ex, ioc, oid, std::move(op), + 0, nullptr, boost::asio::deferred); + }(); + std::move(init2)([] (error_code ec, version_t ver) { + EXPECT_EQ(boost::system::errc::read_only_file_system, ec); + EXPECT_EQ(0, ver); + }); + + service.run(); +} + TEST_F(AsioRados, AsyncWriteOperationFuture) { boost::asio::io_context service; @@ -640,6 +779,46 @@ TEST_F(AsioRados, AsyncNotifyCallback) service.run(); } +TEST_F(AsioRados, AsyncNotifyDeferred) +{ + boost::asio::io_context service; + auto ex = service.get_executor(); + + constexpr uint64_t timeout = 0; + + auto init1 = [&] { // pass local variables that go out of scope + librados::IoCtx ioc = io; + std::string oid = "exist"; + bufferlist bl; + bl.append("hello"); + return librados::async_notify(ex, ioc, oid, bl, timeout, + boost::asio::deferred); + }(); + std::move(init1)([&] (error_code ec, version_t ver, bufferlist reply) { + EXPECT_FALSE(ec); + EXPECT_LT(0, ver); + std::vector acks; + std::vector timeouts; + io.decode_notify_response(reply, &acks, &timeouts); + }); + + auto init2 = [&] { + librados::IoCtx ioc = io; + std::string oid = "noexist"; + bufferlist bl; + bl.append("hello"); + return librados::async_notify(ex, ioc, oid, bl, timeout, + boost::asio::deferred); + }(); + std::move(init2)([] (error_code ec, version_t ver, bufferlist reply) { + EXPECT_EQ(boost::system::errc::no_such_file_or_directory, ec); + EXPECT_EQ(0, ver); + EXPECT_EQ(0, reply.length()); + }); + + service.run(); +} + TEST_F(AsioRados, AsyncNotifyFuture) { boost::asio::io_context service;