From a4f338e77fa7ee22a2e1090b41d74fdec031fa38 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Thu, 4 Jun 2026 17:41:48 +0800 Subject: [PATCH] crimson/os/seastore: also update lba mappings' shadow fields when updating paddr synchronously Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cached_extent.cc | 25 +++++++++++++++++-- .../os/seastore/lba/btree_lba_manager.cc | 23 ++++++++++++++--- .../os/seastore/lba/btree_lba_manager.h | 3 ++- src/crimson/os/seastore/transaction.h | 7 +++--- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/crimson/os/seastore/cached_extent.cc b/src/crimson/os/seastore/cached_extent.cc index cdf5378c42b..5d22fef0b7c 100644 --- a/src/crimson/os/seastore/cached_extent.cc +++ b/src/crimson/os/seastore/cached_extent.cc @@ -504,8 +504,29 @@ void ExtentCommitter::maybe_sync_copied_lba_key() { auto &lextent = static_cast(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; + } } } diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.cc b/src/crimson/os/seastore/lba/btree_lba_manager.cc index 10a38fa9d32..10cb09f5490 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -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 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 shadow) { + update_paddr_sync(c.trans, laddr, paddr, shadow); }); auto [niter, inserted] = co_await btree.copy( c, diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index c78289bbf41..1bbd3a07ef2 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -617,7 +617,8 @@ private: void update_paddr_sync( Transaction &t, laddr_t laddr, - paddr_t paddr); + paddr_t paddr, + std::optional shadow); /** diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 8e907a692e9..ceab4491e6d 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -748,7 +748,7 @@ public: bool force_rewrite_conflict = false; using update_copied_lba_key_func_t = - std::function; + std::function)>; 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 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;