std::make_shared<AsyncOpInfo<1>>(std::array<uint64_t, 1>{0},
std::array<uint64_t, 1>{opSize});
op_info->bufferlist[0] = db->generate_data(0, opSize);
- op_info->wop.write_full(op_info->bufferlist[0]);
+ librados::ObjectWriteOperation wop;
+ wop.write_full(op_info->bufferlist[0]);
auto create_cb = [this](boost::system::error_code ec, version_t ver) {
ceph_assert(ec == boost::system::errc::success);
finish_io();
};
librados::async_operate(asio.get_executor(), io, oid,
- &op_info->wop, 0, nullptr, create_cb);
+ std::move(wop), 0, nullptr, create_cb);
break;
}
case OpType::Remove: {
start_io();
auto op_info = std::make_shared<AsyncOpInfo<0>>();
- op_info->wop.remove();
+ librados::ObjectWriteOperation wop;
+ wop.remove();
auto remove_cb = [this](boost::system::error_code ec, version_t ver) {
ceph_assert(ec == boost::system::errc::success);
finish_io();
};
librados::async_operate(asio.get_executor(), io, oid,
- &op_info->wop, 0, nullptr, remove_cb);
+ std::move(wop), 0, nullptr, remove_cb);
break;
}
case OpType::Read:
auto op_info =
std::make_shared<AsyncOpInfo<N>>(readOp.offset, readOp.length);
+ librados::ObjectReadOperation rop;
for (int i = 0; i < N; i++) {
- op_info->rop.read(readOp.offset[i] * block_size,
- readOp.length[i] * block_size, &op_info->bufferlist[i],
- nullptr);
+ rop.read(readOp.offset[i] * block_size,
+ readOp.length[i] * block_size, &op_info->bufferlist[i],
+ nullptr);
}
auto read_cb = [this, op_info](boost::system::error_code ec, version_t ver,
bufferlist bl) {
finish_io();
};
librados::async_operate(asio.get_executor(), io, oid,
- &op_info->rop, 0, nullptr, read_cb);
+ std::move(rop), 0, nullptr, read_cb);
num_io++;
};
ReadWriteOp<opType, N> writeOp) {
auto op_info =
std::make_shared<AsyncOpInfo<N>>(writeOp.offset, writeOp.length);
+ librados::ObjectWriteOperation wop;
for (int i = 0; i < N; i++) {
op_info->bufferlist[i] =
db->generate_data(writeOp.offset[i], writeOp.length[i]);
- op_info->wop.write(writeOp.offset[i] * block_size,
- op_info->bufferlist[i]);
+ wop.write(writeOp.offset[i] * block_size,
+ op_info->bufferlist[i]);
}
auto write_cb = [this](boost::system::error_code ec, version_t ver) {
ceph_assert(ec == boost::system::errc::success);
finish_io();
};
librados::async_operate(asio.get_executor(), io, oid,
- &op_info->wop, 0, nullptr, write_cb);
+ std::move(wop), 0, nullptr, write_cb);
num_io++;
};
ReadWriteOp<opType, N> writeOp) {
auto op_info =
std::make_shared<AsyncOpInfo<N>>(writeOp.offset, writeOp.length);
+ librados::ObjectWriteOperation wop;
for (int i = 0; i < N; i++) {
op_info->bufferlist[i] =
db->generate_data(writeOp.offset[i], writeOp.length[i]);
- op_info->wop.write(writeOp.offset[i] * block_size,
- op_info->bufferlist[i]);
+ wop.write(writeOp.offset[i] * block_size,
+ op_info->bufferlist[i]);
}
auto write_cb = [this, writeOp](boost::system::error_code ec,
version_t ver) {
finish_io();
};
librados::async_operate(asio.get_executor(), io, oid,
- &op_info->wop, 0, nullptr, write_cb);
+ std::move(wop), 0, nullptr, write_cb);
num_io++;
};
template <int N>
class AsyncOpInfo {
public:
- librados::ObjectReadOperation rop;
- librados::ObjectWriteOperation wop;
std::array<ceph::bufferlist, N> bufferlist;
std::array<uint64_t, N> offset;
std::array<uint64_t, N> length;
void applyInjectOp(IoOp& op);
};
} // namespace io_exerciser
-} // namespace ceph
\ No newline at end of file
+} // namespace ceph
/// instance must preserve its underlying implementation until completion.
template <boost::asio::execution::executor IoExecutor, typename CompletionToken>
auto async_operate(IoExecutor ex, IoCtx& io, const std::string& oid,
- ObjectReadOperation *read_op, int flags,
+ ObjectReadOperation read_op, int flags,
const jspan_context* trace_ctx, CompletionToken&& token)
{
using Op = detail::AsyncOp<bufferlist>;
using Signature = typename Op::Signature;
return boost::asio::async_initiate<CompletionToken, Signature>(
[] (auto handler, IoExecutor ex, const IoCtx& i, const std::string& oid,
- ObjectReadOperation *read_op, int flags) {
+ ObjectReadOperation read_op, int flags) {
constexpr bool is_read = true;
auto p = Op::create(ex, is_read, std::move(handler));
auto& op = p->user_data;
- IoCtx& io = const_cast<IoCtx&>(i);
- int ret = io.aio_operate(oid, op.aio_completion.get(), read_op,
+ auto& io = const_cast<IoCtx&>(i);
+ 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()};
} else {
p.release(); // release ownership until completion
}
- }, token, ex, io, oid, read_op, flags);
+ }, token, ex, io, oid, std::move(read_op), flags);
}
/// Calls IoCtx::aio_operate() and arranges for the AioCompletion to call a
/// instance must preserve its underlying implementation until completion.
template <boost::asio::execution::executor IoExecutor, typename CompletionToken>
auto async_operate(IoExecutor ex, IoCtx& io, const std::string& oid,
- ObjectWriteOperation *write_op, int flags,
+ ObjectWriteOperation write_op, int flags,
const jspan_context* trace_ctx, CompletionToken &&token)
{
using Op = detail::AsyncOp<void>;
using Signature = typename Op::Signature;
return boost::asio::async_initiate<CompletionToken, Signature>(
[] (auto handler, IoExecutor ex, const IoCtx& i, const std::string& oid,
- ObjectWriteOperation *write_op, int flags,
+ ObjectWriteOperation write_op, int flags,
const jspan_context* trace_ctx) {
constexpr bool is_read = false;
auto p = Op::create(ex, is_read, std::move(handler));
auto& op = p->user_data;
- IoCtx& io = const_cast<IoCtx&>(i);
- int ret = io.aio_operate(oid, op.aio_completion.get(), write_op, flags, trace_ctx);
+ auto& io = const_cast<IoCtx&>(i);
+ 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, 0);
} else {
p.release(); // release ownership until completion
}
- }, token, ex, io, oid, write_op, flags, trace_ctx);
+ }, token, ex, io, oid, std::move(write_op), flags, trace_ctx);
}
/// Calls IoCtx::aio_notify() and arranges for the AioCompletion to call a
auto& yield = y.get_yield_context();
auto ex = yield.get_executor();
boost::system::error_code ec;
- auto [ver, bl] = librados::async_operate(ex, ioctx, oid, op,
+ auto [ver, bl] = librados::async_operate(ex, ioctx, oid, std::move(*op),
flags, trace_info, yield[ec]);
if (pbl) {
*pbl = std::move(bl);
auto& yield = y.get_yield_context();
auto ex = yield.get_executor();
boost::system::error_code ec;
- version_t ver = librados::async_operate(ex, ioctx, oid, op,
+ version_t ver = librados::async_operate(ex, ioctx, oid, std::move(*op),
flags, trace_info, yield[ec]);
if (pver) {
*pver = ver;
// executor so it can safely call back into Aio without locking
auto ex = yield.get_executor();
- librados::async_operate(ex, ctx, r.obj.oid, &op, 0, trace_ctx,
+ librados::async_operate(ex, ctx, r.obj.oid, std::move(op), 0, trace_ctx,
bind_executor(ex, Handler{aio, ctx, r}));
};
}
EXPECT_LT(0, ver);
EXPECT_EQ("hello", bl.to_str());
};
- librados::async_operate(ex, io, "exist", &op, 0, nullptr, success_cb);
+ librados::async_operate(ex, io, "exist", std::move(op),
+ 0, nullptr, success_cb);
}
{
librados::ObjectReadOperation op;
EXPECT_EQ(0, ver);
EXPECT_EQ(0, bl.length());
};
- librados::async_operate(ex, io, "noexist", &op, 0, nullptr, failure_cb);
+ librados::async_operate(ex, io, "noexist", std::move(op),
+ 0, nullptr, failure_cb);
}
service.run();
}
{
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
- f1 = librados::async_operate(ex, io, "exist", &op, 0, nullptr,
- boost::asio::use_future);
+ f1 = librados::async_operate(ex, io, "exist", std::move(op),
+ 0, nullptr, boost::asio::use_future);
}
std::future<read_result> f2;
{
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
- f2 = librados::async_operate(ex, io, "noexist", &op, 0, nullptr,
- boost::asio::use_future);
+ f2 = librados::async_operate(ex, io, "noexist", std::move(op),
+ 0, nullptr, boost::asio::use_future);
}
service.run();
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
error_code ec;
- auto [ver, bl] = librados::async_operate(ex, io, "exist", &op,
+ auto [ver, bl] = librados::async_operate(ex, io, "exist", std::move(op),
0, nullptr, yield[ec]);
EXPECT_FALSE(ec);
EXPECT_LT(0, ver);
librados::ObjectReadOperation op;
op.read(0, 0, nullptr, nullptr);
error_code ec;
- auto [ver, bl] = librados::async_operate(ex, io, "noexist", &op,
+ auto [ver, bl] = librados::async_operate(ex, io, "noexist", std::move(op),
0, nullptr, yield[ec]);
EXPECT_EQ(boost::system::errc::no_such_file_or_directory, ec);
EXPECT_EQ(0, ver);
EXPECT_FALSE(ec);
EXPECT_LT(0, ver);
};
- librados::async_operate(ex, io, "exist", &op, 0, nullptr, success_cb);
+ librados::async_operate(ex, io, "exist", std::move(op),
+ 0, nullptr, success_cb);
}
{
librados::ObjectWriteOperation op;
EXPECT_EQ(boost::system::errc::read_only_file_system, ec);
EXPECT_EQ(0, ver);
};
- librados::async_operate(ex, snapio, "exist", &op, 0, nullptr, failure_cb);
+ librados::async_operate(ex, snapio, "exist", std::move(op),
+ 0, nullptr, failure_cb);
}
service.run();
}
{
librados::ObjectWriteOperation op;
op.write_full(bl);
- f1 = librados::async_operate(ex, io, "exist", &op, 0, nullptr,
- boost::asio::use_future);
+ f1 = librados::async_operate(ex, io, "exist", std::move(op),
+ 0, nullptr, boost::asio::use_future);
}
std::future<version_t> f2;
{
librados::ObjectWriteOperation op;
op.write_full(bl);
- f2 = librados::async_operate(ex, snapio, "exist", &op, 0, nullptr,
- boost::asio::use_future);
+ f2 = librados::async_operate(ex, snapio, "exist", std::move(op),
+ 0, nullptr, boost::asio::use_future);
}
service.run();
librados::ObjectWriteOperation op;
op.write_full(bl);
error_code ec;
- auto ver = librados::async_operate(ex, io, "exist", &op,
+ auto ver = librados::async_operate(ex, io, "exist", std::move(op),
0, nullptr, yield[ec]);
EXPECT_FALSE(ec);
EXPECT_LT(0, ver);
librados::ObjectWriteOperation op;
op.write_full(bl);
error_code ec;
- auto ver = librados::async_operate(ex, snapio, "exist", &op,
+ auto ver = librados::async_operate(ex, snapio, "exist", std::move(op),
0, nullptr, yield[ec]);
EXPECT_EQ(boost::system::errc::read_only_file_system, ec);
EXPECT_EQ(0, ver);
librados::ObjectReadOperation op;
op.assert_exists();
- librados::async_operate(ex, io, "noexist", &op, 0, nullptr,
+ librados::async_operate(ex, io, "noexist", std::move(op), 0, nullptr,
capture(signal, result));
service.poll();
librados::ObjectReadOperation op;
op.assert_exists();
- librados::async_operate(ex, io, "noexist", &op, 0, nullptr,
+ librados::async_operate(ex, io, "noexist", std::move(op), 0, nullptr,
capture(signal, result));
service.poll();
librados::ObjectWriteOperation op;
op.assert_exists();
- librados::async_operate(ex, io, "noexist", &op, 0, nullptr,
+ librados::async_operate(ex, io, "noexist", std::move(op), 0, nullptr,
capture(signal, result));
service.poll();
librados::ObjectWriteOperation op;
op.assert_exists();
- librados::async_operate(ex, io, "noexist", &op, 0, nullptr,
+ librados::async_operate(ex, io, "noexist", std::move(op), 0, nullptr,
capture(signal, ec));
service.poll();