]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: add CEPH_OSD_OP_ASSERT_VER 45348/head
authorchunmei-liu <chunmei.liu@intel.com>
Fri, 11 Mar 2022 07:36:43 +0000 (23:36 -0800)
committerchunmei-liu <chunmei.liu@intel.com>
Tue, 15 Mar 2022 02:42:42 +0000 (19:42 -0700)
Signed-off-by: chunmei-liu <chunmei.liu@intel.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/ops_executer.h

index 910294a0721d23643da57eb6d60e1e8564971b5d..8c7b235b34fe28cc6f0890efec0677b12a048628 100644 (file)
@@ -459,6 +459,19 @@ auto OpsExecuter::do_write_op(Func&& f, bool um) {
   user_modify = um;
   return std::forward<Func>(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::osd_op_errorator>
 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));
index 025b040ff7e4096306adcd7528c9f741b69fa77d..6714bb69256ea2abdd41e17639a3cda629895b39 100644 (file)
@@ -41,6 +41,7 @@ class OpsExecuter : public seastar::enable_lw_shared_from_this<OpsExecuter> {
     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 <class Func>
   auto do_const_op(Func&& f);