From: Samuel Just Date: Wed, 15 Oct 2025 22:47:30 +0000 (+0000) Subject: crimson/.../btree_lba_manager: convert clone_mapping to coroutine X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2c7dec4cefdc0531feaea4d3492da0e6df7d5293;p=ceph-ci.git crimson/.../btree_lba_manager: convert clone_mapping to coroutine Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.cc b/src/crimson/os/seastore/lba/btree_lba_manager.cc index d7bea5c7ca5..cf5f5040c97 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -325,81 +325,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( - 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(), - 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(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(), + 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