]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction: should consider non-aligned remapped 67589/head
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 4 Mar 2026 15:12:51 +0000 (23:12 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 9 Mar 2026 09:56:41 +0000 (17:56 +0800)
extents when updating paddrs for TRIM_DIRTY/CLEANER transactions

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

index 06b64e49da52d35047dda8ac1cd7b2cdbb421e49..cb65589a28e21c6a329dca8068631eeaf249a108 100644 (file)
@@ -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());
   }
 }
 
index 9a119b3a3fd41a5e74af50f05398cf361a56ca9b..e88651d7d35e435a6b4168edffe6f974ae8bfc87 100644 (file)
@@ -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<CachedExtent*> 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);
     }
   }