]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/linked_tree_node: get_child_sync should also get
authorXuehan Xu <xuxuehan@qianxin.com>
Tue, 2 Jun 2026 15:29:15 +0000 (23:29 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Sat, 6 Jun 2026 09:37:45 +0000 (17:37 +0800)
transactional views of the extent

Fixes: https://tracker.ceph.com/issues/76945
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/lba/btree_lba_manager.cc
src/crimson/os/seastore/linked_tree_node.h

index 892ac8c0eb8ed6969e1e61a55a40541841e5e2d3..57fb29032bc6216c02a25a8314259b3d33a7dc47 100644 (file)
@@ -573,6 +573,41 @@ public:
     }
   }
 
+  CachedExtentRef get_extent_viewable_by_trans_sync(
+    Transaction &t,
+    CachedExtentRef extent) final {
+    assert(extent->is_valid());
+
+    CachedExtent* p_extent = nullptr;
+    if (extent->is_stable()) {
+      p_extent = extent->maybe_get_transactional_view(t);
+      ceph_assert(p_extent);
+      if (p_extent != extent.get()) {
+        assert(p_extent->is_pending_in_trans(t.get_trans_id()));
+        assert(!p_extent->is_pending_io());
+        if (p_extent->is_mutable()) {
+          assert(p_extent->is_fully_loaded());
+          assert(!p_extent->is_pending_io());
+        } else {
+          assert(p_extent->is_exist_clean());
+        }
+      } else {
+        // stable from trans-view
+        assert(!p_extent->is_pending_in_trans(t.get_trans_id()));
+      }
+    } else {
+      assert(!extent->is_pending_io() || extent->is_exist_clean());
+      assert(extent->is_pending_in_trans(t.get_trans_id()));
+      if (extent->is_mutable()) {
+        assert(extent->is_fully_loaded());
+      } else {
+        assert(extent->is_exist_clean());
+      }
+      p_extent = extent.get();
+    }
+    return p_extent;
+  }
+
   get_extent_iertr::future<CachedExtentRef>
   get_extent_viewable_by_trans(
     Transaction &t,
index 90aa368e0a660c1628825e0c6eac996461897dac..f6e415c0e82dc74b7db86c1d3f2c5093bd2a679b 100644 (file)
@@ -1137,6 +1137,7 @@ void BtreeLBAManager::update_paddr_sync(
   auto c = get_context(t);
   auto btree = get_btree_sync<LBABtree>(c);
   auto iter = btree.lower_bound_sync(c, laddr);
+  assert(iter.get_leaf_node()->is_pending());
   auto cursor = iter.get_cursor(c);
   btree.update(
     c,
index 2f74dcc82871b154788a96f57c57933970c57449..3683f90972b28a004ae36c1f02c908a210e63da2 100644 (file)
@@ -260,6 +260,9 @@ public:
       return ext->template cast<T>();
     });
   }
+  virtual CachedExtentRef get_extent_viewable_by_trans_sync(
+    Transaction &t,
+    CachedExtentRef extent) = 0;
   virtual get_child_iertr::future<> maybe_wait_accessible(
     Transaction &, CachedExtent&) = 0;
   virtual CachedExtentRef peek_extent_viewable_by_trans(
@@ -333,12 +336,25 @@ public:
     btreenode_pos_t pos,
     node_key_t key)
   {
+    auto &me = down_cast();
     assert(children.capacity());
     assert(key == down_cast().iter_idx(pos).get_key());
     auto child = children[pos];
     ceph_assert(!is_reserved_ptr(child));
-    assert(is_valid_child_ptr(child));
-    return static_cast<ChildT*>(child);
+    if (is_valid_child_ptr(child)) {
+      auto ret = etvr.get_extent_viewable_by_trans_sync(
+        t, static_cast<ChildT*>(child));
+      return ret->template cast<ChildT>();
+    } else {
+      assert(me.is_pending());
+      auto &sparent = me.get_stable_for_key(key);
+      auto spos = sparent.lower_bound(key).get_offset();
+      child = sparent.children[spos];
+      assert(is_valid_child_ptr(child));
+      auto ret = etvr.get_extent_viewable_by_trans_sync(
+        t, static_cast<ChildT*>(child));
+      return ret->template cast<ChildT>();
+    }
   }
 
   template <typename ChildT>