crimson/os/seastore: also update lba mappings' shadow fields when

updating paddr synchronously

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
This commit is contained in:
Xuehan Xu 2026-06-04 17:41:48 +08:00
parent 6db2d97c74
commit a4f338e77f
4 changed files with 49 additions and 9 deletions

View 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;
}
}
}

View 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,

View 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);
/**

View 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;