From: Xuehan Xu Date: Tue, 2 Jun 2026 15:29:15 +0000 (+0800) Subject: crimson/os/seastore/linked_tree_node: get_child_sync should also get X-Git-Tag: v21.0.1~37^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=842dfd2d73608967a8cd76b576bc4cc3fe8de964;p=ceph.git crimson/os/seastore/linked_tree_node: get_child_sync should also get transactional views of the extent Fixes: https://tracker.ceph.com/issues/76945 Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 892ac8c0eb8..57fb29032bc 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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 get_extent_viewable_by_trans( Transaction &t, diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.cc b/src/crimson/os/seastore/lba/btree_lba_manager.cc index 90aa368e0a6..f6e415c0e82 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -1137,6 +1137,7 @@ void BtreeLBAManager::update_paddr_sync( auto c = get_context(t); auto btree = get_btree_sync(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, diff --git a/src/crimson/os/seastore/linked_tree_node.h b/src/crimson/os/seastore/linked_tree_node.h index 2f74dcc8287..3683f90972b 100644 --- a/src/crimson/os/seastore/linked_tree_node.h +++ b/src/crimson/os/seastore/linked_tree_node.h @@ -260,6 +260,9 @@ public: return ext->template cast(); }); } + 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(child); + if (is_valid_child_ptr(child)) { + auto ret = etvr.get_extent_viewable_by_trans_sync( + t, static_cast(child)); + return ret->template cast(); + } 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(child)); + return ret->template cast(); + } } template