]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/lba: coroutinize LBACursor::refresh()
authorXuehan Xu <xuxuehan@qianxin.com>
Mon, 22 Jun 2026 12:47:12 +0000 (20:47 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 22 Jun 2026 12:53:24 +0000 (20:53 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/lba/lba_btree_node.cc

index ed94290f72a7ac6a674f4a48725de3bbcd076285..5f64cba221781bbf3597995f8a189b8a5c5309c2 100644 (file)
@@ -87,60 +87,55 @@ LBALeafNode::internal_const_iterator_t LBALeafNode::insert(
 base_iertr::future<> LBACursor::refresh()
 {
   LOG_PREFIX(LBACursor::refresh);
-  return with_btree<lba::LBABtree>(
-    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<LBABtree>(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<lba::LBALeafNode>();
+  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<lba::LBALeafNode>();
-    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());
 }
 
 }