]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: add OP_OMAP_CLEAR support
authorChunmei Liu <chunmei.liu@intel.com>
Thu, 24 Mar 2022 06:59:39 +0000 (23:59 -0700)
committerChunmei Liu <chunmei.liu@intel.com>
Wed, 30 Mar 2022 00:44:40 +0000 (17:44 -0700)
Signed-off-by: Chunmei Liu <chunmei.liu@intel.com>
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h

index 81147963b2dc6c25f15381debfd273d09a0076fa..e6524a811f0dc1db3eb2ff75c6da6588472b8ff6 100644 (file)
@@ -1153,6 +1153,10 @@ SeaStore::tm_ret SeaStore::_do_transaction_step(
        std::move(first), std::move(last));
     }
     break;
+    case Transaction::OP_OMAP_CLEAR:
+    {
+      return _omap_clear(ctx, get_onode(op->oid));
+    }
     case Transaction::OP_COLL_HINT:
     {
       ceph::bufferlist hint;
@@ -1277,6 +1281,37 @@ SeaStore::tm_ret SeaStore::_omap_set_header(
   return tm_iertr::now();
 }
 
+SeaStore::tm_ret SeaStore::_omap_clear(
+  internal_context_t &ctx,
+  OnodeRef &onode)
+{
+  LOG_PREFIX(SeaStore::_omap_clear);
+  DEBUGT("{} {} keys", *ctx.transaction, *onode);
+  if (auto omap_root = onode->get_layout().omap_root.get(
+    onode->get_metadata_hint(segment_manager->get_block_size()));
+    omap_root.is_null()) {
+    return seastar::now();
+  } else {
+    return seastar::do_with(
+      BtreeOMapManager(*transaction_manager),
+      onode->get_layout().omap_root.get(
+        onode->get_metadata_hint(segment_manager->get_block_size())),
+      [&ctx, &onode](
+      auto &omap_manager,
+      auto &omap_root) {
+      return omap_manager.omap_clear(
+        omap_root,
+        *ctx.transaction)
+      .si_then([&] {
+        if (omap_root.must_update()) {
+          onode->get_mutable_layout(*ctx.transaction
+          ).omap_root.update(omap_root);
+        }
+      });
+    });
+  }
+}
+
 SeaStore::tm_ret SeaStore::_omap_rmkeys(
   internal_context_t &ctx,
   OnodeRef &onode,
index 57c1d99891f5328386f3b9a0d2c6d18c2138e744..d75b07a06defbcd775cb34743528b225543e005b 100644 (file)
@@ -347,6 +347,9 @@ private:
     internal_context_t &ctx,
     OnodeRef &onode,
     ceph::bufferlist &&header);
+  tm_ret _omap_clear(
+    internal_context_t &ctx,
+    OnodeRef &onode);
   tm_ret _omap_rmkeys(
     internal_context_t &ctx,
     OnodeRef &onode,