]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: reclaim storage resources when removing onode
authorXuehan Xu <xxhdx1985126@gmail.com>
Wed, 30 Nov 2022 03:55:39 +0000 (11:55 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Thu, 12 Jan 2023 04:01:35 +0000 (12:01 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/seastore.cc

index f320e424ed93addff25fbf6d6cc8ce919c58cd2f..912332d0cd31c3694191924052dd7a42bb364ca3 100644 (file)
@@ -1074,6 +1074,9 @@ ObjectDataHandler::clear_ret ObjectDataHandler::clear(
             ctx.t,
             object_data.get_reserved_data_base(),
             object_data.get_reserved_data_len());
+      if (object_data.is_null()) {
+       return clear_iertr::now();
+      }
       return trim_data_reservation(ctx, object_data, 0);
     });
 }
index 0cac0cad1a166cbe766d02eb551a1cb213982079..e6e984ceb017a6335df8303279ce7a52ed51afd3 100644 (file)
@@ -1139,6 +1139,7 @@ SeaStore::tm_ret SeaStore::_do_transaction_step(
       switch (op->op) {
       case Transaction::OP_REMOVE:
       {
+       TRACET("removing {}", *ctx.transaction, i.get_oid(op->oid));
         return _remove(ctx, onodes[op->oid]);
       }
       case Transaction::OP_CREATE:
@@ -1266,7 +1267,40 @@ SeaStore::tm_ret SeaStore::_remove(
 {
   LOG_PREFIX(SeaStore::_remove);
   DEBUGT("onode={}", *ctx.transaction, *onode);
-  return onode_manager->erase_onode(*ctx.transaction, onode);
+  auto fut = BtreeOMapManager::omap_clear_iertr::now();
+  auto omap_root = onode->get_layout().omap_root.get(
+    onode->get_metadata_hint(device->get_block_size()));
+  if (omap_root.get_location() != L_ADDR_NULL) {
+    fut = seastar::do_with(
+      BtreeOMapManager(*transaction_manager),
+      onode->get_layout().omap_root.get(
+       onode->get_metadata_hint(device->get_block_size())),
+      [&ctx, onode](auto &omap_manager, auto &omap_root) {
+      return omap_manager.omap_clear(
+       omap_root,
+       *ctx.transaction
+      );
+    });
+  }
+  return fut.si_then([this, &ctx, onode] {
+    return seastar::do_with(
+      ObjectDataHandler(max_object_size),
+      [=, this, &ctx](auto &objhandler) {
+       return objhandler.clear(
+         ObjectDataHandler::context_t{
+           *transaction_manager,
+           *ctx.transaction,
+           *onode,
+         });
+    });
+  }).si_then([this, &ctx, onode]() mutable {
+    return onode_manager->erase_onode(*ctx.transaction, onode);
+  }).handle_error_interruptible(
+    crimson::ct_error::input_output_error::pass_further(),
+    crimson::ct_error::assert_all(
+      "Invalid error in SeaStore::_remove"
+    )
+  );
 }
 
 SeaStore::tm_ret SeaStore::_touch(