]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/.../btree_lba_manager: convert clone_mapping to coroutine
authorSamuel Just <sjust@redhat.com>
Wed, 15 Oct 2025 22:47:30 +0000 (22:47 +0000)
committerSamuel Just <sjust@redhat.com>
Mon, 5 Jan 2026 21:14:58 +0000 (13:14 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba/btree_lba_manager.cc

index 7df77da85817bf46c2de4748d3a29b529ad7ee57..effee7336a0c7c4723ff1163615dd40485a1fb2c 100644 (file)
@@ -326,81 +326,45 @@ BtreeLBAManager::clone_mapping(
   DEBUGT("pos={}, mapping={}, laddr={}, {}~{} updateref={}",
     t, pos, mapping, laddr, offset, len, updateref);
   assert(offset + len <= mapping.get_length());
-  struct state_t {
-    LBAMapping pos;
-    LBAMapping mapping;
-    laddr_t laddr;
-    extent_len_t offset;
-    extent_len_t len;
-  };
   auto c = get_context(t);
-  return seastar::do_with(
-    std::move(mapping),
-    [this, updateref, c](auto &mapping) {
-    if (updateref) {
-      auto fut = update_refcount_iertr::make_ready_future<
-       LBACursorRef>(mapping.direct_cursor);
-      if (!mapping.direct_cursor) {
-       fut = resolve_indirect_cursor(c, *mapping.indirect_cursor);
-      }
-      return fut.si_then([this, c, &mapping](auto cursor) {
-       mapping.direct_cursor = cursor;
-       assert(mapping.direct_cursor->is_viewable());
-       return update_refcount(c.trans, cursor.get(), 1
-       ).si_then([&mapping](auto res) {
-         assert(!res.mapping.is_indirect());
-         mapping.direct_cursor = std::move(res.mapping.direct_cursor);
-         return std::move(mapping);
-       });
-      });
-    } else {
-      return update_refcount_iertr::make_ready_future<
-       LBAMapping>(std::move(mapping));
+  if (updateref) {
+    if (!mapping.direct_cursor) {
+      mapping.direct_cursor = co_await resolve_indirect_cursor(
+       c, *mapping.indirect_cursor);
     }
-  }).si_then([c, this, pos=std::move(pos), len,
-             offset, laddr](auto mapping) mutable {
-    return seastar::do_with(
-      state_t{std::move(pos), std::move(mapping), laddr, offset, len},
-      [this, c](auto &state) {
-      return with_btree<LBABtree>(
-       cache,
-       c,
-       [c, &state](auto &btree) mutable {
-       auto &cursor = state.pos.get_effective_cursor();
-       return cursor.refresh(
-       ).si_then([&state, c, &btree]() mutable {
-         auto &cursor = state.pos.get_effective_cursor();
-         assert(state.laddr + state.len <= cursor.key);
-          auto inter_key = state.mapping.is_indirect()
-            ? state.mapping.get_intermediate_key()
-            : state.mapping.get_key();
-          inter_key = (inter_key + state.offset).checked_to_laddr();
-         return btree.insert(
-           c,
-           btree.make_partial_iter(c, cursor),
-           state.laddr,
-            lba_map_val_t{state.len, inter_key, EXTENT_DEFAULT_REF_COUNT, 0});
-       }).si_then([c, &state](auto p) {
-         auto &[iter, inserted] = p;
-         auto &leaf_node = *iter.get_leaf_node();
-         leaf_node.insert_child_ptr(
-           iter.get_leaf_pos(),
-           get_reserved_ptr<LBALeafNode, laddr_t>(),
-           leaf_node.get_size() - 1 /*the size before the insert*/);
-         auto cursor = iter.get_cursor(c);
-         return state.mapping.refresh(
-         ).si_then([cursor=std::move(cursor)](auto mapping) mutable {
-           return clone_mapping_ret_t{
-             LBAMapping(mapping.direct_cursor, std::move(cursor)),
-             mapping};
-         });
-       });
-      });
-    });
-  }).handle_error_interruptible(
-    clone_mapping_iertr::pass_further{},
-    crimson::ct_error::assert_all{"unexpected error"}
-  );
+    assert(mapping.direct_cursor->is_viewable());
+    auto res = co_await update_refcount(
+      c.trans, mapping.direct_cursor.get(), 1
+    ).handle_error_interruptible(
+      clone_mapping_iertr::pass_further{},
+      crimson::ct_error::assert_all{"unexpected error"}
+    );
+    assert(!res.mapping.is_indirect());
+    mapping.direct_cursor = std::move(res.mapping.direct_cursor);
+  }
+  auto btree = co_await get_btree<LBABtree>(cache, c);
+  auto &cursor = pos.get_effective_cursor();
+  co_await cursor.refresh();
+  assert(laddr + len <= cursor.key);
+  auto inter_key = mapping.is_indirect()
+    ? mapping.get_intermediate_key()
+    : mapping.get_key();
+  inter_key = (inter_key + offset).checked_to_laddr();
+  auto p = co_await btree.insert(
+    c,
+    btree.make_partial_iter(c, cursor),
+    laddr,
+    lba_map_val_t{len, inter_key, EXTENT_DEFAULT_REF_COUNT, 0});
+  auto &[iter, inserted] = p;
+  auto &leaf_node = *iter.get_leaf_node();
+  leaf_node.insert_child_ptr(
+    iter.get_leaf_pos(),
+    get_reserved_ptr<LBALeafNode, laddr_t>(),
+    leaf_node.get_size() - 1 /*the size before the insert*/);
+  mapping = co_await mapping.refresh();
+  co_return clone_mapping_ret_t{
+    LBAMapping(mapping.direct_cursor, iter.get_cursor(c)),
+    mapping};
 }
 
 BtreeLBAManager::get_cursor_ret