From f4e228a023dcf2fc7b213807a437709add810265 Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Thu, 10 Mar 2022 23:36:43 -0800 Subject: [PATCH] crimson: add CEPH_OSD_OP_ASSERT_VER Signed-off-by: chunmei-liu --- src/crimson/osd/ops_executer.cc | 17 +++++++++++++++++ src/crimson/osd/ops_executer.h | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 910294a0721..8c7b235b34f 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -459,6 +459,19 @@ auto OpsExecuter::do_write_op(Func&& f, bool um) { user_modify = um; return std::forward(f)(pg->get_backend(), obc->obs, txn); } +OpsExecuter::call_errorator::future<> OpsExecuter::do_assert_ver( + OSDOp& osd_op, + const ObjectState& os) +{ + if (!osd_op.op.assert_ver.ver) { + return crimson::ct_error::invarg::make(); + } else if (osd_op.op.assert_ver.ver < os.oi.user_version) { + return crimson::ct_error::erange::make(); + } else if (osd_op.op.assert_ver.ver > os.oi.user_version) { + return crimson::ct_error::value_too_large::make(); + } + return seastar::now(); +} OpsExecuter::interruptible_errorated_future OpsExecuter::execute_op(OSDOp& osd_op) @@ -634,6 +647,10 @@ OpsExecuter::execute_op(OSDOp& osd_op) return do_read_op([this, &osd_op] (auto&, const auto& os) { return do_op_notify_ack(osd_op, os); }); + case CEPH_OSD_OP_ASSERT_VER: + return do_read_op([this, &osd_op] (auto&, const auto& os) { + return do_assert_ver(osd_op, os); + }); default: logger().warn("unknown op {}", ceph_osd_op_name(op.op)); diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 025b040ff7e..6714bb69256 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -41,6 +41,7 @@ class OpsExecuter : public seastar::enable_lw_shared_from_this { crimson::stateful_ec, crimson::ct_error::enoent, crimson::ct_error::invarg, + crimson::ct_error::erange, crimson::ct_error::permission_denied, crimson::ct_error::operation_not_supported, crimson::ct_error::input_output_error, @@ -205,6 +206,9 @@ private: watch_ierrorator::future<> do_op_notify_ack( OSDOp& osd_op, const ObjectState& os); + call_errorator::future<> do_assert_ver( + OSDOp& osd_op, + const ObjectState& os); template auto do_const_op(Func&& f); -- 2.39.5