From: Xuehan Xu Date: Mon, 22 Jun 2026 12:47:12 +0000 (+0800) Subject: crimson/os/seastore/lba: coroutinize LBACursor::refresh() X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=01c0602b1d959f2559f66f21adaa6182dcbfe8fd;p=ceph.git crimson/os/seastore/lba: coroutinize LBACursor::refresh() Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/lba/lba_btree_node.cc b/src/crimson/os/seastore/lba/lba_btree_node.cc index ed94290f72a..5f64cba2217 100644 --- a/src/crimson/os/seastore/lba/lba_btree_node.cc +++ b/src/crimson/os/seastore/lba/lba_btree_node.cc @@ -87,60 +87,55 @@ LBALeafNode::internal_const_iterator_t LBALeafNode::insert( base_iertr::future<> LBACursor::refresh() { LOG_PREFIX(LBACursor::refresh); - return with_btree( - ctx.cache, - ctx, - [this, FNAME, c=ctx](auto &btree) { - c.trans.cursor_stats.num_refresh_parent_total++; - if (!parent->is_valid()) { - c.trans.cursor_stats.num_refresh_invalid_parent++; - SUBTRACET( - seastore_lba, - "cursor {} parent is invalid, re-search from scratch", - c.trans, *this); - return btree.lower_bound(c, this->get_laddr() - ).si_then([this](lba::LBABtree::iterator it) { - assert(this->get_laddr() == it.get_key()); - iter = LBALeafNode::iterator( - it.get_leaf_node().get(), - it.get_leaf_pos()); - auto leaf = it.get_leaf_node(); - parent = leaf; - modifications = leaf->modifications; - }); + auto btree = co_await get_btree(ctx.cache, ctx); + ctx.trans.cursor_stats.num_refresh_parent_total++; + + if (!parent->is_valid()) { + ctx.trans.cursor_stats.num_refresh_invalid_parent++; + SUBTRACET( + seastore_lba, + "cursor {} parent is invalid, re-search from scratch", + ctx.trans, *this); + lba::LBABtree::iterator it = co_await btree.lower_bound( + ctx, this->get_laddr()); + assert(this->get_laddr() == it.get_key()); + iter = LBALeafNode::iterator( + it.get_leaf_node().get(), + it.get_leaf_pos()); + auto leaf = it.get_leaf_node(); + parent = leaf; + modifications = leaf->modifications; + co_return; + } + assert(parent->is_stable() || + parent->is_pending_in_trans(ctx.trans.get_trans_id())); + auto leaf = parent->cast(); + if (leaf->is_pending_in_trans(ctx.trans.get_trans_id())) { + if (leaf->modified_since(modifications)) { + ctx.trans.cursor_stats.num_refresh_modified_viewable_parent++; + } else { + // no need to refresh + co_return; } - assert(parent->is_stable() || - parent->is_pending_in_trans(c.trans.get_trans_id())); - auto leaf = parent->cast(); - if (leaf->is_pending_in_trans(c.trans.get_trans_id())) { - if (leaf->modified_since(modifications)) { - c.trans.cursor_stats.num_refresh_modified_viewable_parent++; - } else { - // no need to refresh - return base_iertr::now(); - } + } else { + auto [viewable, l] = leaf->resolve_transaction(ctx.trans, get_laddr()); + SUBTRACET(seastore_lba, "cursor: {} viewable: {}", + ctx.trans, *this, viewable); + if (!viewable) { + leaf = l; + ctx.trans.cursor_stats.num_refresh_unviewable_parent++; + parent = leaf; } else { - auto [viewable, l] = leaf->resolve_transaction(c.trans, get_laddr()); - SUBTRACET(seastore_lba, "cursor: {} viewable: {}", - c.trans, *this, viewable); - if (!viewable) { - leaf = l; - c.trans.cursor_stats.num_refresh_unviewable_parent++; - parent = leaf; - } else { - assert(leaf.get() == l.get()); - assert(leaf->is_stable()); - return base_iertr::now(); - } + assert(leaf.get() == l.get()); + assert(leaf->is_stable()); + co_return; } + } - modifications = leaf->modifications; - iter = leaf->lower_bound(get_laddr()); - assert(is_viewable()); - - return base_iertr::now(); - }); + modifications = leaf->modifications; + iter = leaf->lower_bound(get_laddr()); + assert(is_viewable()); } }