]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/lba,TM: remove shadows when trimming dirty non-data
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 3 Jun 2026 09:36:42 +0000 (17:36 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Fri, 10 Jul 2026 14:24:37 +0000 (22:24 +0800)
extents

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/async_cleaner.cc
src/crimson/os/seastore/async_cleaner.h
src/crimson/os/seastore/lba/btree_lba_manager.cc
src/crimson/os/seastore/transaction_manager.h

index 9d515e13cd9b66fef5398a35f62cbbf85c6a6f97..7ccf710d9e246b39d9fe516c12184d11d9f2d0db 100644 (file)
@@ -717,8 +717,11 @@ JournalTrimmerImpl::trim_dirty()
            return trans_intr::do_for_each(
              dirty_list,
              [this, &t](auto &e) {
-             return extent_callback->rewrite_extent(
+              return extent_callback->maybe_remove_shadow(t, *e
+              ).si_then([this, &t, e] {
+               return extent_callback->rewrite_extent(
                  t, e, INIT_GENERATION, NULL_TIME);
+              });
            });
          });
        }).si_then([this, &t] {
index 647e0b233b3a12fa1466c5c12f2e6388733bd14f..9751dc15eea52c55a5aae36f3eaa6216087fcaa4 100644 (file)
@@ -398,6 +398,18 @@ public:
     laddr_t prefix,
     std::size_t max_proceed_size) = 0;
 
+  /**
+   * maybe_remove_shadow
+   *
+   * Remove the shadow of the extent if it exists
+   */
+  using maybe_remove_shadow_iertr = base_iertr;
+  using maybe_remove_shadow_ret =
+    maybe_remove_shadow_iertr::future<>;
+  virtual maybe_remove_shadow_ret maybe_remove_shadow(
+    Transaction &t,
+    CachedExtent &e) = 0;
+
   /**
    * get_extents_if_live
    *
index 37a6e91f249d5cd309e1123c7e214f00d9168a04..758e32fff4564903523bd53d971b56cd65084b56 100644 (file)
@@ -973,6 +973,11 @@ BtreeLBAManager::update_mappings(
              ceph_assert(in.len == len);
              if (likely(in.pladdr.get_paddr() == prev_addr)) {
                 ret.pladdr = addr;
+                if (c.trans.get_src() == transaction_type_t::TRIM_DIRTY) {
+                  // This is a dirty onode/omap extent that are rewritten,
+                  // the shadow extent should be removed.
+                  ret.shadow_paddr = P_ADDR_NULL;
+                }
               } else {
                 // this can only happen when the extent is EXIST_CLEAN
                 // and is demoted onto the cold tier by a DEMOTE trans.
index 5edc797840d9b8d96a71a0fc9f16ffb7d514d504..702e1ae253f3157c5e5b9be85dc337872129ac25 100644 (file)
@@ -993,6 +993,42 @@ public:
     laddr_t start,
     std::size_t max_proceed_size) final;
 
+  maybe_remove_shadow_ret maybe_remove_shadow(
+    Transaction &t,
+    CachedExtent &e) {
+    if (!e.is_logical()) {
+      co_return;
+    }
+    auto &extent = static_cast<LogicalChildNode&>(e);
+    auto cursor = co_await lba_manager->get_cursor(t, extent
+    ).handle_error_interruptible(
+      crimson::ct_error::input_output_error::pass_further{},
+      crimson::ct_error::enoent::assert_failure{}
+    );
+    if (cursor->has_shadow_paddr()) {
+      if (auto shadow = extent.get_shadow(); shadow) {
+        cache->retire_extent(t, shadow);
+      } else {
+        auto laddr = cursor->get_laddr();
+        std::ignore = cache->retire_absent_extent_addr_by_type(
+          t, laddr,
+          cursor->get_shadow_paddr(),
+          cursor->get_length(),
+          cursor->get_extent_type(),
+          [&extent, laddr](auto &ext) {
+            auto lextent = ext.template cast<LogicalChildNode>();
+            assert(ext.is_logical());
+            assert(!lextent->has_laddr());
+            assert(!ext.has_been_invalidated());
+            lextent->set_laddr(laddr);
+            ext.set_shadow_extent(true);
+            extent.set_shadow(lextent);
+          }
+        );
+      }
+    }
+  }
+
   using ExtentCallbackInterface::get_extents_if_live_ret;
   get_extents_if_live_ret get_extents_if_live(
     Transaction &t,