From: Xuehan Xu Date: Wed, 4 Mar 2026 15:12:51 +0000 (+0800) Subject: crimson/os/seastore/transaction: should consider non-aligned remapped X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b8a824788c0def08254709b9f4d24b45e9d967d7;p=ceph.git crimson/os/seastore/transaction: should consider non-aligned remapped extents when updating paddrs for TRIM_DIRTY/CLEANER transactions Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cached_extent.cc b/src/crimson/os/seastore/cached_extent.cc index 06b64e49da5..cb65589a28e 100644 --- a/src/crimson/os/seastore/cached_extent.cc +++ b/src/crimson/os/seastore/cached_extent.cc @@ -425,7 +425,8 @@ void ExtentCommitter::commit_and_share_paddr() { prior.set_paddr(extent.get_paddr()); } item.t->post_stable_extent_paddr_mod(item, retired); - item.t->maybe_update_pending_paddr(old_paddr, extent.get_paddr()); + item.t->maybe_update_pending_paddr( + old_paddr, extent.get_paddr(), extent.get_length()); } } diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 9a119b3a3fd..e88651d7d35 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -442,15 +442,37 @@ public: } void maybe_update_pending_paddr( const paddr_t &old_paddr, - const paddr_t &new_paddr) { - if (!new_paddr.is_absolute()) { - return; + const paddr_t &new_paddr, + extent_len_t len) { + assert(new_paddr.is_absolute()); + + std::vector exts; + for (auto [bottom, top] = write_set.get_overlap(old_paddr, len); + bottom != top; + bottom++) { + auto &mextent = *bottom; + if (mextent.is_initial_pending()) { + continue; + } + exts.emplace_back(&mextent); } - auto where2 = write_set.find_offset(old_paddr); - if (where2 != write_set.end()) { - auto &mextent = *where2; - write_set.erase(where2); - mextent.set_paddr(new_paddr); + for (auto i : exts) { + auto &mextent = *i; + write_set.erase(mextent); + extent_len_t off = 0; + if (new_paddr.is_absolute_segmented()) { + assert(mextent.get_paddr().as_seg_paddr().get_segment_id() + == old_paddr.as_seg_paddr().get_segment_id()); + assert(mextent.get_paddr().as_seg_paddr().get_segment_off() + >= old_paddr.as_seg_paddr().get_segment_off()); + off = mextent.get_paddr().as_seg_paddr().get_segment_off() + - old_paddr.as_seg_paddr().get_segment_off(); + } else { + assert(new_paddr.is_absolute_random_block()); + off = mextent.get_paddr().as_blk_paddr().get_device_off() - + old_paddr.as_blk_paddr().get_device_off(); + } + mextent.set_paddr(new_paddr + off); write_set.insert(mextent); } }