{
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
{
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
{
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);
- 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) {
+ 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);
+ 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);
}
/// 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