]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: implement omap-clear op
authorKefu Chai <kchai@redhat.com>
Thu, 20 Aug 2020 12:52:11 +0000 (20:52 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 24 Aug 2020 09:49:41 +0000 (17:49 +0800)
it is tested by test_rados.py:TestIoctx.test_clear_omap, so let's support
this op in crimson as well.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index a9e27b39c8546ea95cff21940ea4ca2bd4b9103d..9616399a95a86cc10d3e09646e81cddb77cbb02d 100644 (file)
@@ -560,6 +560,10 @@ OpsExecuter::execute_op(OSDOp& osd_op)
     return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
       return backend.omap_remove_range(os, osd_op, txn);
     }, true);
+  case CEPH_OSD_OP_OMAPCLEAR:
+    return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
+      return backend.omap_clear(os, osd_op, txn, *osd_op_params);
+    }, true);
 
   // watch/notify
   case CEPH_OSD_OP_WATCH:
index b87fdba6ee54644fb751f01bc8b206f8981b8d09..827441efddec94894b6e440fc278ab0ef54cc364 100644 (file)
@@ -1052,6 +1052,30 @@ seastar::future<> PGBackend::omap_remove_range(
   return seastar::now();
 }
 
+PGBackend::omap_clear_ertr::future<>
+PGBackend::omap_clear(
+  ObjectState& os,
+  OSDOp& osd_op,
+  ceph::os::Transaction& txn,
+  osd_op_params_t& osd_op_params)
+{
+  if (__builtin_expect(stopping, false)) {
+    throw crimson::common::system_shutdown_exception();
+  }
+  if (!os.exists || os.oi.is_whiteout()) {
+    logger().debug("{}: object does not exist: {}", os.oi.soid);
+    return crimson::ct_error::enoent::make();
+  }
+  if (!os.oi.is_omap()) {
+    return omap_clear_ertr::now();
+  }
+  txn.omap_clear(coll->get_cid(), ghobject_t{os.oi.soid});
+  osd_op_params.clean_regions.mark_omap_dirty();
+  os.oi.clear_omap_digest();
+  os.oi.clear_flag(object_info_t::FLAG_OMAP);
+  return omap_clear_ertr::now();
+}
+
 seastar::future<struct stat> PGBackend::stat(
   CollectionRef c,
   const ghobject_t& oid) const
index b650f9095b496e45b30bb2b0e1cdbd4c256af99d..6cad22eeb8937933abc90d8c39c75fcb09da719c 100644 (file)
@@ -183,6 +183,12 @@ public:
     ObjectState& os,
     OSDOp& osd_op,
     ceph::os::Transaction& trans);
+  using omap_clear_ertr = crimson::errorator<crimson::ct_error::enoent>;
+  omap_clear_ertr::future<> omap_clear(
+    ObjectState& os,
+    OSDOp& osd_op,
+    ceph::os::Transaction& trans,
+    osd_op_params_t& osd_op_params);
 
   virtual void got_rep_op_reply(const MOSDRepOpReply&) {}
   virtual seastar::future<> stop() = 0;