From: Samuel Just Date: Sat, 18 Oct 2025 00:34:57 +0000 (-0700) Subject: crimson/.../btree_lba_manager: convert _update_mapping to coroutine X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2010e8b69713d6e25792dcf26cd7dd2f09fb07f6;p=ceph.git crimson/.../btree_lba_manager: convert _update_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 458e3b8ebff..38917b13270 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -863,46 +863,40 @@ BtreeLBAManager::_update_mapping_ret BtreeLBAManager::_update_mapping( Transaction &t, LBACursor &cursor, - update_func_t &&f, + update_func_t f, LogicalChildNode* nextent) { assert(!is_reserved_ptr(nextent)); assert(cursor.is_viewable()); auto c = get_context(t); - return with_btree( - cache, - c, - [c, f=std::move(f), &cursor, nextent](auto &btree) { - auto iter = btree.make_partial_iter(c, cursor); - auto ret = f(iter.get_val()); - if (ret.refcount == 0) { - auto laddr = cursor.get_laddr(); - return btree.remove( - c, - iter - ).si_then([ret, c, laddr](auto iter) { - return update_mapping_ret_bare_t{ - laddr, std::move(ret), iter.get_cursor(c)}; - }); - } else { - return btree.update( - c, - iter, - ret, - // child-ptr may already be correct, - // see LBAManager::update_mappings() - nextent && !nextent->has_parent_tracker() - ? nextent : nullptr - ).si_then([c, nextent](auto iter) { - assert(!nextent || - (nextent->has_parent_tracker() + auto btree = co_await get_btree(cache, c); + auto iter = btree.make_partial_iter(c, cursor); + auto ret = f(iter.get_val()); + if (ret.refcount == 0) { + auto laddr = cursor.get_laddr(); + iter = co_await btree.remove( + c, + iter + ); + co_return update_mapping_ret_bare_t{ + laddr, std::move(ret), iter.get_cursor(c)}; + } else { + iter = co_await btree.update( + c, + iter, + ret, + // child-ptr may already be correct, + // see LBAManager::update_mappings() + nextent && !nextent->has_parent_tracker() + ? nextent : nullptr + ); + assert(!nextent || + (nextent->has_parent_tracker() && nextent->peek_parent_node().get() == iter.get_leaf_node().get())); - LBACursorRef cursor = iter.get_cursor(c); - assert(!cursor->is_end()); - return update_mapping_ret_bare_t{std::move(cursor)}; - }); - } - }); + LBACursorRef cursor = iter.get_cursor(c); + assert(!cursor->is_end()); + co_return update_mapping_ret_bare_t{std::move(cursor)}; + } } BtreeLBAManager::scan_mapped_space_ret diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index 57417630cb4..9d55d5037a5 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -411,7 +411,7 @@ private: _update_mapping_ret _update_mapping( Transaction &t, LBACursor &cursor, - update_func_t &&f, + update_func_t f, LogicalChildNode*); struct insert_position_t {