{
using Op = detail::AsyncOp<bufferlist>;
using Signature = typename Op::Signature;
- boost::asio::async_completion<CompletionToken, Signature> init(token);
- auto p = Op::create(ctx.get_executor(), init.completion_handler);
- auto& op = p->user_data;
-
- int ret = io.aio_read(oid, op.aio_completion.get(), &op.result, len, off);
- if (ret < 0) {
- auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
- ceph::async::post(std::move(p), ec, bufferlist{});
- } else {
- p.release(); // release ownership until completion
- }
- return init.result.get();
+ return boost::asio::async_initiate<CompletionToken, Signature>(
+ [] (auto handler, auto ex, IoCtx& io, const std::string& oid,
+ size_t len, uint64_t off) {
+ auto p = Op::create(ex, std::move(handler));
+ auto& op = p->user_data;
+
+ int ret = io.aio_read(oid, op.aio_completion.get(), &op.result, len, off);
+ if (ret < 0) {
+ auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
+ ceph::async::post(std::move(p), ec, bufferlist{});
+ } else {
+ p.release(); // release ownership until completion
+ }
+ }, token, ctx.get_executor(), io, oid, len, off);
}
/// Calls IoCtx::aio_write() and arranges for the AioCompletion to call a
{
using Op = detail::AsyncOp<void>;
using Signature = typename Op::Signature;
- boost::asio::async_completion<CompletionToken, Signature> init(token);
- auto p = Op::create(ctx.get_executor(), init.completion_handler);
- auto& op = p->user_data;
-
- int ret = io.aio_write(oid, op.aio_completion.get(), bl, len, off);
- if (ret < 0) {
- auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
- ceph::async::post(std::move(p), ec);
- } else {
- p.release(); // release ownership until completion
- }
- return init.result.get();
+ return boost::asio::async_initiate<CompletionToken, Signature>(
+ [] (auto handler, auto ex, IoCtx& io, const std::string& oid,
+ bufferlist &bl, size_t len, uint64_t off) {
+ auto p = Op::create(ex, std::move(handler));
+ auto& op = p->user_data;
+
+ int ret = io.aio_write(oid, op.aio_completion.get(), bl, len, off);
+ if (ret < 0) {
+ auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
+ ceph::async::post(std::move(p), ec);
+ } else {
+ p.release(); // release ownership until completion
+ }
+ }, token, ctx.get_executor(), io, oid, bl, len, off);
}
/// Calls IoCtx::aio_operate() and arranges for the AioCompletion to call a
template <typename ExecutionContext, typename CompletionToken>
auto async_operate(ExecutionContext& ctx, IoCtx& io, const std::string& oid,
ObjectReadOperation *read_op, int flags,
- CompletionToken&& token, const jspan_context* trace_ctx = nullptr)
+ const jspan_context* trace_ctx, CompletionToken&& token)
{
using Op = detail::AsyncOp<bufferlist>;
using Signature = typename Op::Signature;
- boost::asio::async_completion<CompletionToken, Signature> init(token);
- auto p = Op::create(ctx.get_executor(), init.completion_handler);
- auto& op = p->user_data;
-
- int ret = io.aio_operate(oid, op.aio_completion.get(), read_op,
- flags, &op.result);
- if (ret < 0) {
- auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
- ceph::async::post(std::move(p), ec, bufferlist{});
- } else {
- p.release(); // release ownership until completion
- }
- return init.result.get();
+ return boost::asio::async_initiate<CompletionToken, Signature>(
+ [] (auto handler, auto ex, IoCtx& io, const std::string& oid,
+ ObjectReadOperation *read_op, int flags) {
+ auto p = Op::create(ex, std::move(handler));
+ auto& op = p->user_data;
+
+ int ret = io.aio_operate(oid, op.aio_completion.get(), read_op,
+ flags, &op.result);
+ if (ret < 0) {
+ auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
+ ceph::async::post(std::move(p), ec, bufferlist{});
+ } else {
+ p.release(); // release ownership until completion
+ }
+ }, token, ctx.get_executor(), io, oid, read_op, flags);
}
/// Calls IoCtx::aio_operate() and arranges for the AioCompletion to call a
template <typename ExecutionContext, typename CompletionToken>
auto async_operate(ExecutionContext& ctx, IoCtx& io, const std::string& oid,
ObjectWriteOperation *write_op, int flags,
- CompletionToken &&token, const jspan_context* trace_ctx = nullptr)
+ const jspan_context* trace_ctx, CompletionToken &&token)
{
using Op = detail::AsyncOp<void>;
using Signature = typename Op::Signature;
- boost::asio::async_completion<CompletionToken, Signature> init(token);
- auto p = Op::create(ctx.get_executor(), init.completion_handler);
- auto& op = p->user_data;
-
- int ret = io.aio_operate(oid, op.aio_completion.get(), write_op, flags, trace_ctx);
- if (ret < 0) {
- auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
- ceph::async::post(std::move(p), ec);
- } else {
- p.release(); // release ownership until completion
- }
- return init.result.get();
+ return boost::asio::async_initiate<CompletionToken, Signature>(
+ [] (auto handler, auto ex, IoCtx& io, const std::string& oid,
+ ObjectWriteOperation *write_op, int flags,
+ const jspan_context* trace_ctx) {
+ auto p = Op::create(ex, std::move(handler));
+ auto& op = p->user_data;
+
+ int ret = io.aio_operate(oid, op.aio_completion.get(), write_op, flags, trace_ctx);
+ if (ret < 0) {
+ auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
+ ceph::async::post(std::move(p), ec);
+ } else {
+ p.release(); // release ownership until completion
+ }
+ }, token, ctx.get_executor(), io, oid, write_op, flags, trace_ctx);
}
/// Calls IoCtx::aio_notify() and arranges for the AioCompletion to call a
{
using Op = detail::AsyncOp<bufferlist>;
using Signature = typename Op::Signature;
- boost::asio::async_completion<CompletionToken, Signature> init(token);
- auto p = Op::create(ctx.get_executor(), init.completion_handler);
- auto& op = p->user_data;
-
- int ret = io.aio_notify(oid, op.aio_completion.get(),
- bl, timeout_ms, &op.result);
- if (ret < 0) {
- auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
- ceph::async::post(std::move(p), ec, bufferlist{});
- } else {
- p.release(); // release ownership until completion
- }
- return init.result.get();
+ return boost::asio::async_initiate<CompletionToken, Signature>(
+ [] (auto handler, auto ex, IoCtx& io, const std::string& oid,
+ bufferlist& bl, uint64_t timeout_ms) {
+ auto p = Op::create(ex, std::move(handler));
+ auto& op = p->user_data;
+
+ int ret = io.aio_notify(oid, op.aio_completion.get(),
+ bl, timeout_ms, &op.result);
+ if (ret < 0) {
+ auto ec = boost::system::error_code{-ret, librados::detail::err_category()};
+ ceph::async::post(std::move(p), ec, bufferlist{});
+ } else {
+ p.release(); // release ownership until completion
+ }
+ }, token, ctx.get_executor(), io, oid, bl, timeout_ms);
}
} // namespace librados
EXPECT_FALSE(ec);
EXPECT_EQ("hello", bl.to_str());
};
- librados::async_operate(service, io, "exist", &op, 0, success_cb);
+ librados::async_operate(service, io, "exist", &op, 0, nullptr, success_cb);
}
{
librados::ObjectReadOperation op;
auto failure_cb = [&] (boost::system::error_code ec, bufferlist bl) {
EXPECT_EQ(boost::system::errc::no_such_file_or_directory, ec);
};
- librados::async_operate(service, io, "noexist", &op, 0, failure_cb);
+ librados::async_operate(service, io, "noexist", &op, 0, nullptr, failure_cb);
}
service.run();
}
{
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
- f1 = librados::async_operate(service, io, "exist", &op, 0,
+ f1 = librados::async_operate(service, io, "exist", &op, 0, nullptr,
boost::asio::use_future);
}
std::future<bufferlist> f2;
{
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
- f2 = librados::async_operate(service, io, "noexist", &op, 0,
+ f2 = librados::async_operate(service, io, "noexist", &op, 0, nullptr,
boost::asio::use_future);
}
service.run();
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
boost::system::error_code ec;
- auto bl = librados::async_operate(service, io, "exist", &op, 0,
+ auto bl = librados::async_operate(service, io, "exist", &op, 0, nullptr,
yield[ec]);
EXPECT_FALSE(ec);
EXPECT_EQ("hello", bl.to_str());
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
boost::system::error_code ec;
- auto bl = librados::async_operate(service, io, "noexist", &op, 0,
+ auto bl = librados::async_operate(service, io, "noexist", &op, 0, nullptr,
yield[ec]);
EXPECT_EQ(boost::system::errc::no_such_file_or_directory, ec);
};
auto success_cb = [&] (boost::system::error_code ec) {
EXPECT_FALSE(ec);
};
- librados::async_operate(service, io, "exist", &op, 0, success_cb);
+ librados::async_operate(service, io, "exist", &op, 0, nullptr, success_cb);
}
{
librados::ObjectWriteOperation op;
auto failure_cb = [&] (boost::system::error_code ec) {
EXPECT_EQ(boost::system::errc::read_only_file_system, ec);
};
- librados::async_operate(service, snapio, "exist", &op, 0, failure_cb);
+ librados::async_operate(service, snapio, "exist", &op, 0, nullptr, failure_cb);
}
service.run();
}
{
librados::ObjectWriteOperation op;
op.write_full(bl);
- f1 = librados::async_operate(service, io, "exist", &op, 0,
+ f1 = librados::async_operate(service, io, "exist", &op, 0, nullptr,
boost::asio::use_future);
}
std::future<void> f2;
{
librados::ObjectWriteOperation op;
op.write_full(bl);
- f2 = librados::async_operate(service, snapio, "exist", &op, 0,
+ f2 = librados::async_operate(service, snapio, "exist", &op, 0, nullptr,
boost::asio::use_future);
}
service.run();
librados::ObjectWriteOperation op;
op.write_full(bl);
boost::system::error_code ec;
- librados::async_operate(service, io, "exist", &op, 0, yield[ec]);
+ librados::async_operate(service, io, "exist", &op, 0, nullptr, yield[ec]);
EXPECT_FALSE(ec);
};
spawn::spawn(service, success_cr);
librados::ObjectWriteOperation op;
op.write_full(bl);
boost::system::error_code ec;
- librados::async_operate(service, snapio, "exist", &op, 0, yield[ec]);
+ librados::async_operate(service, snapio, "exist", &op, 0, nullptr, yield[ec]);
EXPECT_EQ(boost::system::errc::read_only_file_system, ec);
};
spawn::spawn(service, failure_cr);