int librados::IoCtxImpl::aio_operate(const object_t& oid,
::ObjectOperation *o, AioCompletionImpl *c,
- const SnapContext& snap_context, int flags,
+ const SnapContext& snap_context,
+ const ceph::real_time *pmtime, int flags,
const blkin_trace_info *trace_info)
{
FUNCTRACE(client->cct);
OID_EVENT_TRACE(oid.name.c_str(), "RADOS_WRITE_OP_BEGIN");
- auto ut = ceph::real_clock::now();
+ const ceph::real_time ut = (pmtime ? *pmtime : ceph::real_clock::now());
/* can't write to a snapshot */
if (snap_seq != CEPH_NOSNAP)
return -EROFS;
::ObjectOperation op;
prepare_assert_ops(&op);
op.rmxattr(name);
- return aio_operate(oid, &op, c, snapc, 0);
+ return aio_operate(oid, &op, c, snapc, nullptr, 0);
}
int librados::IoCtxImpl::aio_setxattr(const object_t& oid, AioCompletionImpl *c,
::ObjectOperation op;
prepare_assert_ops(&op);
op.setxattr(name, bl);
- return aio_operate(oid, &op, c, snapc, 0);
+ return aio_operate(oid, &op, c, snapc, nullptr, 0);
}
namespace {
int operate_read(const object_t& oid, ::ObjectOperation *o, bufferlist *pbl, int flags=0);
int aio_operate(const object_t& oid, ::ObjectOperation *o,
AioCompletionImpl *c, const SnapContext& snap_context,
- int flags, const blkin_trace_info *trace_info = nullptr);
+ const ceph::real_time *pmtime, int flags,
+ const blkin_trace_info *trace_info = nullptr);
int aio_operate_read(const object_t& oid, ::ObjectOperation *o,
AioCompletionImpl *c, int flags, bufferlist *pbl, const blkin_trace_info *trace_info = nullptr);
::ObjectOperation *oo = (::ObjectOperation *) write_op;
librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
librados::AioCompletionImpl *c = (librados::AioCompletionImpl*)completion;
- int retval = ctx->aio_operate(obj, oo, c, ctx->snapc, translate_flags(flags));
+ int retval = ctx->aio_operate(obj, oo, c, ctx->snapc, nullptr, translate_flags(flags));
tracepoint(librados, rados_aio_write_op_operate_exit, retval);
return retval;
}
if (unlikely(!o->impl))
return -EINVAL;
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc,
- io_ctx_impl->snapc, 0);
+ io_ctx_impl->snapc, o->impl->prt, 0);
}
int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
ObjectWriteOperation *o, int flags)
if (unlikely(!o->impl))
return -EINVAL;
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc,
- io_ctx_impl->snapc,
+ io_ctx_impl->snapc, o->impl->prt,
translate_flags(flags));
}
snv[i] = snaps[i];
SnapContext snapc(snap_seq, snv);
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc,
- snapc, 0);
+ snapc, o->impl->prt, 0);
}
int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
snv[i] = snaps[i];
SnapContext snapc(snap_seq, snv);
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc,
- snapc, 0, trace_info);
+ snapc, o->impl->prt, 0, trace_info);
}
int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
for (size_t i = 0; i < snaps.size(); ++i)
snv[i] = snaps[i];
SnapContext snapc(snap_seq, snv);
- return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc, snapc,
+ return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc, snapc, o->impl->prt,
translate_flags(flags), trace_info);
}
ObjectWriteOperation *op) {
TestIoCtxImpl *ctx = reinterpret_cast<TestIoCtxImpl*>(io_ctx_impl);
TestObjectOperationImpl *ops = reinterpret_cast<TestObjectOperationImpl*>(op->impl);
- return ctx->aio_operate(oid, *ops, c->pc, NULL, 0);
+ return ctx->aio_operate(oid, *ops, c->pc, nullptr, nullptr, 0);
}
int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
snv[i] = snaps[i];
SnapContext snapc(seq, snv);
- return ctx->aio_operate(oid, *ops, c->pc, &snapc, flags);
+ return ctx->aio_operate(oid, *ops, c->pc, &snapc, nullptr, flags);
}
int IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
return TestMemIoCtxImpl::aio_notify(o, c, bl, timeout_ms, pbl);
}
- MOCK_METHOD5(aio_operate, int(const std::string&, TestObjectOperationImpl&,
- AioCompletionImpl*, SnapContext*, int));
+ MOCK_METHOD6(aio_operate, int(const std::string&, TestObjectOperationImpl&,
+ AioCompletionImpl*, SnapContext*,
+ const ceph::real_time*, int));
int do_aio_operate(const std::string& o, TestObjectOperationImpl& ops,
- AioCompletionImpl* c, SnapContext* snapc, int flags) {
- return TestMemIoCtxImpl::aio_operate(o, ops, c, snapc, flags);
+ AioCompletionImpl* c, SnapContext* snapc,
+ const ceph::real_time* pmtime, int flags) {
+ return TestMemIoCtxImpl::aio_operate(o, ops, c, snapc, pmtime, flags);
}
MOCK_METHOD4(aio_watch, int(const std::string& o, AioCompletionImpl *c,
ON_CALL(*this, clone()).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_clone));
ON_CALL(*this, aio_notify(_, _, _, _, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_aio_notify));
- ON_CALL(*this, aio_operate(_, _, _, _, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_aio_operate));
+ ON_CALL(*this, aio_operate(_, _, _, _, _, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_aio_operate));
ON_CALL(*this, aio_watch(_, _, _, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_aio_watch));
ON_CALL(*this, aio_unwatch(_, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_aio_unwatch));
ON_CALL(*this, assert_exists(_, _)).WillByDefault(Invoke(this, &MockTestMemIoCtxImpl::do_assert_exists));
}
auto completion = create_aio_completion(std::move(c));
- auto r = io_ctx->aio_operate(std::string{o}, *ops, completion, &snapc, 0U);
+ auto r = io_ctx->aio_operate(std::string{o}, *ops, completion, &snapc, nullptr, 0U);
ceph_assert(r == 0);
}
int TestIoCtxImpl::aio_operate(const std::string& oid, TestObjectOperationImpl &ops,
AioCompletionImpl *c, SnapContext *snap_context,
- int flags) {
+ const ceph::real_time *pmtime, int flags) {
// TODO flags for now
ops.get();
m_pending_ops++;
bufferlist& bl, uint64_t timeout_ms, bufferlist *pbl);
virtual int aio_operate(const std::string& oid, TestObjectOperationImpl &ops,
AioCompletionImpl *c, SnapContext *snap_context,
- int flags);
+ const ceph::real_time *pmtime, int flags);
virtual int aio_operate_read(const std::string& oid, TestObjectOperationImpl &ops,
AioCompletionImpl *c, int flags,
bufferlist *pbl, uint64_t snap_id,
void expect_mirror_status_update(
const MirrorImageSiteStatuses& mirror_image_site_statuses,
const std::string& mirror_uuid, int r) {
- EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _, _))
.WillOnce(Invoke([this](auto&&... args) {
int r = m_mock_local_io_ctx->do_aio_operate(decltype(args)(args)...);
m_mock_local_io_ctx->aio_flush();
void expect_mirror_status_removes(const std::set<std::string>& mirror_images,
int r) {
- EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _, _))
.WillOnce(Invoke([this](auto&&... args) {
int r = m_mock_local_io_ctx->do_aio_operate(decltype(args)(args)...);
m_mock_local_io_ctx->aio_flush();
fire_timer_event(&timer_event, &update_task);
C_SaferCond remove_flush_ctx;
- EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _, _))
.WillOnce(Invoke([this, &remove_flush_ctx](auto&&... args) {
int r = m_mock_local_io_ctx->do_aio_operate(decltype(args)(args)...);
m_mock_local_io_ctx->aio_flush();
Context* update_task = nullptr;
fire_timer_event(&timer_event, &update_task);
- EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _, _))
.WillOnce(Invoke([this, &mock_mirror_status_updater](auto&&... args) {
mock_mirror_status_updater.set_mirror_image_status(
"1", {"", cls::rbd::MIRROR_IMAGE_STATUS_STATE_REPLAYING,
fire_timer_event(&timer_event, &update_task);
C_SaferCond on_removed;
- EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _, _))
.WillOnce(Invoke(
[this, &mock_mirror_status_updater, &on_removed](auto&&... args) {
mock_mirror_status_updater.remove_refresh_mirror_image_status(
fire_timer_event(&timer_event, &update_task);
C_SaferCond on_shutdown;
- EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _, _))
.WillOnce(Invoke(
[this, &mock_mirror_status_updater, &on_shutdown](auto&&... args) {
mock_mirror_status_updater.shut_down(&on_shutdown);