From: Samuel Just Date: Fri, 10 Oct 2025 00:27:16 +0000 (+0000) Subject: crimson/.../btree_lba_manager: convert alloc_extents to coroutine X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9c18f6b0c9f7afea2b89fcf4cb833b4c0329fbbb;p=ceph-ci.git crimson/.../btree_lba_manager: convert alloc_extents 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 7e4f59c79dc..177ce9f2109 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -379,65 +379,45 @@ BtreeLBAManager::alloc_extents( DEBUGT("{}", t, pos); assert(pos.is_viewable()); auto c = get_context(t); - return with_btree( - cache, - c, - [c, FNAME, pos=std::move(pos), this, - extents=std::move(extents)](auto &btree) mutable { - auto &cursor = pos.get_effective_cursor(); - return cursor.refresh( - ).si_then( - [&cursor, &btree, extents=std::move(extents), - pos=std::move(pos), c, FNAME, this] { - return seastar::do_with( - std::move(extents), - btree.make_partial_iter(c, cursor), - std::vector(), - [c, &btree, FNAME, this] - (auto &extents, auto &iter, auto &ret) mutable { - return trans_intr::do_for_each( - extents.rbegin(), - extents.rend(), - [&btree, FNAME, &iter, c, &ret, this](auto ext) { - assert(ext->has_laddr()); - stats.num_alloc_extents += ext->get_length(); - return btree.insert( - c, - iter, - ext->get_laddr(), - lba_map_val_t{ - ext->get_length(), - ext->get_paddr(), - EXTENT_DEFAULT_REF_COUNT, - ext->get_last_committed_crc(), - ext->get_type()} - ).si_then([ext, c, FNAME, &iter, &ret](auto p) { - auto &[it, inserted] = p; - ceph_assert(inserted); - auto &leaf_node = *it.get_leaf_node(); - leaf_node.insert_child_ptr( - it.get_leaf_pos(), - ext.get(), - leaf_node.get_size() - 1 /*the size before the insert*/); - TRACET("inserted {}", c.trans, *ext); - ret.emplace(ret.begin(), LBAMapping::create_direct(it.get_cursor(c))); - iter = it; - }); + auto btree = co_await get_btree(cache, c); + auto &cursor = pos.get_effective_cursor(); + co_await cursor.refresh(); + auto iter = btree.make_partial_iter(c, cursor); + std::vector ret; + for (auto eiter = extents.rbegin(); eiter != extents.rend(); ++eiter) { + auto ext = *eiter; + assert(ext->has_laddr()); + stats.num_alloc_extents += ext->get_length(); + auto p = co_await btree.insert( + c, + iter, + ext->get_laddr(), + lba_map_val_t{ + ext->get_length(), + ext->get_paddr(), + EXTENT_DEFAULT_REF_COUNT, + ext->get_last_committed_crc(), + ext->get_type()} + ); + auto &[it, inserted] = p; + ceph_assert(inserted); + auto &leaf_node = *it.get_leaf_node(); + leaf_node.insert_child_ptr( + it.get_leaf_pos(), + ext.get(), + leaf_node.get_size() - 1 /*the size before the insert*/); + TRACET("inserted {}", c.trans, *ext); + ret.emplace(ret.begin(), LBAMapping::create_direct(it.get_cursor(c))); + iter = it; #ifndef NDEBUG - }).si_then([&iter, c] { - if (iter.is_begin()) { - return base_iertr::now(); - } - auto key = iter.get_key(); - return iter.prev(c).si_then([key](auto it) { - assert(key >= it.get_key() + it.get_val().len); - return base_iertr::now(); - }); + if (eiter != extents.rend()) { + auto key = iter.get_key(); + auto it = co_await iter.prev(c); + assert(key >= it.get_key() + it.get_val().len); + } #endif - }).si_then([&ret] { return std::move(ret); }); - }); - }); - }); + } + co_return ret; } BtreeLBAManager::clone_mapping_ret diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index 52e463542ae..08abe449b35 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -170,38 +170,28 @@ public: extent->get_last_committed_crc(), *extent)); } - return seastar::do_with( - std::move(alloc_infos), - [this, &t, hint, has_laddr](auto &alloc_infos) - { - if (has_laddr) { - return alloc_sparse_mappings( - t, hint, alloc_infos, alloc_policy_t::deterministic) + std::list cursors; + if (has_laddr) { + cursors = co_await alloc_sparse_mappings( + t, hint, alloc_infos, alloc_policy_t::deterministic); + assert(alloc_infos.size() == cursors.size()); #ifndef NDEBUG - .si_then([&alloc_infos](std::list cursors) { - assert(alloc_infos.size() == cursors.size()); - auto info_p = alloc_infos.begin(); - auto cursor_p = cursors.begin(); - for (; info_p != alloc_infos.end(); info_p++, cursor_p++) { - auto &cursor = *cursor_p; - assert(cursor->get_laddr() == info_p->key); - } - return alloc_extent_iertr::make_ready_future< - std::list>(std::move(cursors)); - }) -#endif - ; - } else { - return alloc_contiguous_mappings( - t, hint, alloc_infos, alloc_policy_t::linear_search); + auto info_p = alloc_infos.begin(); + auto cursor_p = cursors.begin(); + for (; info_p != alloc_infos.end(); info_p++, cursor_p++) { + auto &cursor = *cursor_p; + assert(cursor->get_laddr() == info_p->key); } - }).si_then([](std::list cursors) { - std::vector ret; - for (auto &cursor : cursors) { - ret.emplace_back(LBAMapping::create_direct(std::move(cursor))); - } - return ret; - }); +#endif + } else { + cursors = co_await alloc_contiguous_mappings( + t, hint, alloc_infos, alloc_policy_t::linear_search); + } + std::vector ret; + for (auto &cursor : cursors) { + ret.emplace_back(LBAMapping::create_direct(std::move(cursor))); + } + co_return ret; } base_iertr::future update_mapping_refcount(