]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: also update lba mappings' shadow fields when
authorXuehan Xu <xuxuehan@qianxin.com>
Thu, 4 Jun 2026 09:41:48 +0000 (17:41 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Fri, 31 Jul 2026 01:40:19 +0000 (09:40 +0800)
updating paddr synchronously

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

index cdf5378c42b789c4db5ea7728d5ba5f64b964ae5..5d22fef0b7c453ee647b7e64dc57f54825426f02 100644 (file)
@@ -504,8 +504,29 @@ void ExtentCommitter::maybe_sync_copied_lba_key() {
   auto &lextent = static_cast<LogicalChildNode&>(extent);
   auto &prior = *extent.prior_instance;
   for (auto &item : prior.read_transactions) {
-    item.t->maybe_sync_copied_lba_key(
-      lextent.get_laddr(), lextent.get_paddr());
+    switch (t.get_src()) {
+    case transaction_type_t::PROMOTE:
+      {
+        auto &shadow = *lextent.get_shadow();
+        item.t->maybe_sync_copied_lba_key(
+          lextent.get_laddr(),
+          lextent.get_paddr(),
+          shadow.get_paddr());
+        break;
+      }
+    case transaction_type_t::DEMOTE:
+      item.t->maybe_sync_copied_lba_key(
+        lextent.get_laddr(),
+        lextent.get_paddr(),
+        P_ADDR_NULL);
+      break;
+    default:
+      item.t->maybe_sync_copied_lba_key(
+        lextent.get_laddr(),
+        lextent.get_paddr(),
+        std::nullopt);
+      break;
+    }
   }
 }
 
index 10a38fa9d327a72e3e2e282ea37e59f72193a88e..10cb09f5490721ae8ae733447b8523593d74a8fc 100644 (file)
@@ -1495,7 +1495,8 @@ BtreeLBAManager::remap_mappings(
 void BtreeLBAManager::update_paddr_sync(
   Transaction &t,
   laddr_t laddr,
-  paddr_t paddr)
+  paddr_t paddr,
+  std::optional<paddr_t> shadow)
 {
   LOG_PREFIX(BtreeLBAManager::update_paddr_sync);
   DEBUGT("laddr={}, paddr={}", t, laddr, paddr);
@@ -1513,12 +1514,28 @@ void BtreeLBAManager::update_paddr_sync(
   ceph_assert(child->is_exist_clean());
   auto cursor = iter.get_cursor(c);
   assert(cursor->get_laddr() == laddr);
+  paddr_t shadow_paddr;
+  if (shadow) {
+    // the committing txn changed the shadow
+    // to *shadow
+    shadow_paddr = *shadow;
+  } else if (cursor->has_shadow_paddr()) {
+    // shadow is preserved by the committer,
+    // and the copy inherited one, so the source
+    // was promoted when it's copied
+    shadow_paddr = cursor->get_shadow_paddr();
+  } else {
+    // shadow is preserved, and nothing is
+    // inherited: not currently promoted
+    shadow_paddr = P_ADDR_NULL;
+  }
   btree.update(
     c,
     std::move(iter),
     lba_map_val_t{
       cursor->get_length(),
       pladdr_t{std::move(paddr)},
+      shadow_paddr,
       cursor->get_refcount(),
       cursor->get_checksum(),
       cursor->get_extent_type()},
@@ -1577,8 +1594,8 @@ BtreeLBAManager::_copy_mapping(
   c.trans.new_lba_key_copied(
     ret.src->get_key(),
     dest_laddr,
-    [this, c](laddr_t laddr, paddr_t paddr) {
-      update_paddr_sync(c.trans, laddr, paddr);
+    [this, c](laddr_t laddr, paddr_t paddr, std::optional<paddr_t> shadow) {
+      update_paddr_sync(c.trans, laddr, paddr, shadow);
     });
   auto [niter, inserted] = co_await btree.copy(
       c,
index c78289bbf41048ad0c314b63b030c384799c28b1..1bbd3a07ef2717f7b98a4e4b4f3274b44304d7e7 100644 (file)
@@ -617,7 +617,8 @@ private:
   void update_paddr_sync(
     Transaction &t,
     laddr_t laddr,
-    paddr_t paddr);
+    paddr_t paddr,
+    std::optional<paddr_t> shadow);
 
 
   /**
index 8e907a692e98e00c65a7bb369cbb34a5937301f0..ceab4491e6da3145ddaedd6e455e196b37bb7b6b 100644 (file)
@@ -748,7 +748,7 @@ public:
   bool force_rewrite_conflict = false;
 
   using update_copied_lba_key_func_t =
-    std::function<void (laddr_t, paddr_t)>;
+    std::function<void (laddr_t, paddr_t, std::optional<paddr_t>)>;
   void new_lba_key_copied(
     laddr_t src,
     laddr_t dest,
@@ -758,7 +758,8 @@ public:
       update_copied_lba_key = std::move(func);
     }
   }
-  void maybe_sync_copied_lba_key(laddr_t laddr, paddr_t paddr) {
+  void maybe_sync_copied_lba_key(
+    laddr_t laddr, paddr_t paddr, std::optional<paddr_t> shadow) {
     if (likely(copied_lba_keys.empty())) {
       return;
     }
@@ -768,7 +769,7 @@ public:
       return;
     }
     laddr_t key = it->second;
-    update_copied_lba_key(key, paddr);
+    update_copied_lba_key(key, paddr, shadow);
   }
   RootBlockRef peek_root() {
     return root;