]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: also remove xattrs when removing onodes 55772/head
authorXuehan Xu <xuxuehan@qianxin.com>
Tue, 27 Feb 2024 08:27:58 +0000 (16:27 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 27 Feb 2024 08:59:47 +0000 (16:59 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h

index 8363b148033366e4f3d7221a621a8b51f207fd20..a2ccd3bd17709f091a87849ae10d325e2853bfa2 100644 (file)
@@ -1480,28 +1480,49 @@ SeaStore::Shard::_do_transaction_step(
 }
 
 SeaStore::Shard::tm_ret
-SeaStore::Shard::_remove(
+SeaStore::Shard::_remove_omaps(
   internal_context_t &ctx,
-  OnodeRef &onode)
+  OnodeRef &onode,
+  omap_root_t &&omap_root)
 {
-  LOG_PREFIX(SeaStore::_remove);
-  DEBUGT("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(
+    return seastar::do_with(
       BtreeOMapManager(*transaction_manager),
-      onode->get_layout().omap_root.get(
-       onode->get_metadata_hint(device->get_block_size())),
+      std::move(omap_root),
       [&ctx, onode](auto &omap_manager, auto &omap_root) {
       return omap_manager.omap_clear(
        omap_root,
        *ctx.transaction
+      ).handle_error_interruptible(
+       crimson::ct_error::input_output_error::pass_further(),
+       crimson::ct_error::assert_all{
+         "Invalid error in SeaStore::_remove"
+       }
       );
     });
   }
-  return fut.si_then([this, &ctx, onode] {
+  return tm_iertr::now();
+}
+
+SeaStore::Shard::tm_ret
+SeaStore::Shard::_remove(
+  internal_context_t &ctx,
+  OnodeRef &onode)
+{
+  LOG_PREFIX(SeaStore::_remove);
+  DEBUGT("onode={}", *ctx.transaction, *onode);
+  return _remove_omaps(
+    ctx,
+    onode,
+    onode->get_layout().omap_root.get(
+      onode->get_metadata_hint(device->get_block_size()))
+  ).si_then([this, &ctx, onode]() mutable {
+    return _remove_omaps(
+      ctx,
+      onode,
+      onode->get_layout().xattr_root.get(
+       onode->get_metadata_hint(device->get_block_size())));
+  }).si_then([this, &ctx, onode] {
     return seastar::do_with(
       ObjectDataHandler(max_object_size),
       [=, this, &ctx](auto &objhandler) {
index bff0092f45332539ddb8c01c08cc8a0bf5548ee4..79f0bb82e12c7e280b07a3808896a934e6070d7e 100644 (file)
@@ -343,6 +343,10 @@ public:
       std::vector<OnodeRef> &d_onodes,
       ceph::os::Transaction::iterator &i);
 
+    tm_ret _remove_omaps(
+      internal_context_t &ctx,
+      OnodeRef &onode,
+      omap_root_t &&omap_root);
     tm_ret _remove(
       internal_context_t &ctx,
       OnodeRef &onode);