From: Samuel Just Date: Tue, 23 Sep 2025 20:51:42 +0000 (-0700) Subject: crimson/.../btree_lba_manager: convert get_mappings to coroutine X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5b4f282f6eef985022fd675c704928d64539cd95;p=ceph-ci.git crimson/.../btree_lba_manager: convert get_mappings 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 625b72225d7..e2bed222eb8 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -126,41 +126,26 @@ BtreeLBAManager::get_mappings( LOG_PREFIX(BtreeLBAManager::get_mappings); TRACET("{}~0x{:x} ...", t, laddr, length); auto c = get_context(t); - return with_btree_state( - cache, c, - [FNAME, this, c, laddr, length](auto& btree, auto& ret) - { - return get_cursors(c, btree, laddr, length - ).si_then([FNAME, this, c, laddr, length, &btree, &ret](auto cursors) { - return seastar::do_with( - std::move(cursors), - [FNAME, this, c, laddr, length, &btree, &ret](auto& cursors) - { - return trans_intr::do_for_each( - cursors, - [FNAME, this, c, laddr, length, &btree, &ret](auto& cursor) - { - assert(!cursor->is_end()); - if (!cursor->is_indirect()) { - ret.emplace_back(LBAMapping::create_direct(std::move(cursor))); - TRACET("{}~0x{:x} got {}", - c.trans, laddr, length, ret.back()); - return get_mappings_iertr::now(); - } - assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT); - assert(cursor->val->checksum == 0); - return this->resolve_indirect_cursor(c, btree, *cursor - ).si_then([FNAME, c, &ret, &cursor, laddr, length](auto direct) { - ret.emplace_back(LBAMapping::create_indirect( - std::move(direct), std::move(cursor))); - TRACET("{}~0x{:x} got {}", - c.trans, laddr, length, ret.back()); - return get_mappings_iertr::now(); - }); - }); - }); - }); - }); + + lba_mapping_list_t ret; + auto btree = co_await get_btree(cache, c); + + auto cursors = co_await get_cursors(c, btree, laddr, length); + for (auto &cursor: cursors) { + assert(!cursor->is_end()); + if (!cursor->is_indirect()) { + ret.emplace_back(LBAMapping::create_direct(std::move(cursor))); + } else { + assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT); + assert(cursor->val->checksum == 0); + auto direct = co_await this->resolve_indirect_cursor(c, btree, *cursor); + ret.emplace_back(LBAMapping::create_indirect( + std::move(direct), std::move(cursor))); + } + TRACET("{}~0x{:x} got {}", + c.trans, laddr, length, ret.back()); + } + co_return ret; } BtreeLBAManager::_get_cursors_ret @@ -224,45 +209,33 @@ BtreeLBAManager::get_mapping( LOG_PREFIX(BtreeLBAManager::get_mapping); TRACET("{} ... search_containing={}", t, laddr, search_containing); auto c = get_context(t); - return with_btree( - cache, c, - [FNAME, this, c, laddr, search_containing](auto& btree) - { - auto fut = get_mapping_iertr::make_ready_future(); - if (search_containing) { - fut = get_containing_cursor(c, btree, laddr); - } else { - fut = get_cursor(c, btree, laddr); - } - return fut.si_then([FNAME, laddr, &btree, c, this, - search_containing](LBACursorRef cursor) { - assert(!cursor->is_end()); - if (!cursor->is_indirect()) { - TRACET("{} got direct cursor {}", - c.trans, laddr, *cursor); - auto mapping = LBAMapping::create_direct(std::move(cursor)); - return get_mapping_iertr::make_ready_future< - LBAMapping>(std::move(mapping)); - } - if (search_containing) { - assert(cursor->contains(laddr)); - } else { - assert(laddr == cursor->get_laddr()); - } - assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT); - assert(cursor->val->checksum == 0); - return resolve_indirect_cursor(c, btree, *cursor - ).si_then([FNAME, c, laddr, indirect=std::move(cursor)] - (auto direct) mutable { - auto mapping = LBAMapping::create_indirect( - std::move(direct), std::move(indirect)); - TRACET("{} got indirect mapping {}", - c.trans, laddr, mapping); - return get_mapping_iertr::make_ready_future< - LBAMapping>(std::move(mapping)); - }); - }); - }); + auto btree = co_await get_btree(cache, c); + + LBACursorRef cursor = co_await ( + search_containing ? + get_containing_cursor(c, btree, laddr) : + get_cursor(c, btree, laddr)); + + assert(!cursor->is_end()); + if (!cursor->is_indirect()) { + TRACET("{} got direct cursor {}", + c.trans, laddr, *cursor); + co_return LBAMapping::create_direct(std::move(cursor)); + } + + if (search_containing) { + assert(cursor->contains(laddr)); + } else { + assert(laddr == cursor->get_laddr()); + } + assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT); + assert(cursor->val->checksum == 0); + auto direct = co_await resolve_indirect_cursor(c, btree, *cursor); + auto mapping = LBAMapping::create_indirect( + std::move(direct), std::move(cursor)); + TRACET("{} got indirect mapping {}", + c.trans, laddr, mapping); + co_return mapping; } BtreeLBAManager::get_mapping_ret @@ -282,25 +255,19 @@ BtreeLBAManager::get_mapping( } #endif auto c = get_context(t); - return with_btree( - cache, - c, - [c, &extent, FNAME](auto &btree) { - return extent.get_parent_node(c.trans, c.cache - ).si_then([&btree, c, &extent, FNAME](auto leaf) { - if (leaf->is_pending()) { - TRACET("find pending extent {} for {}", - c.trans, (void*)leaf.get(), extent); - } + auto btree = co_await get_btree(cache, c); + + auto leaf = co_await extent.get_parent_node(c.trans, c.cache); + + if (leaf->is_pending()) { + TRACET("find pending extent {} for {}", + c.trans, (void*)leaf.get(), extent); + } #ifndef NDEBUG - auto it = leaf->lower_bound(extent.get_laddr()); - assert(it != leaf->end() && it.get_key() == extent.get_laddr()); + auto it = leaf->lower_bound(extent.get_laddr()); + assert(it != leaf->end() && it.get_key() == extent.get_laddr()); #endif - return get_mapping_iertr::make_ready_future< - LBAMapping>(LBAMapping::create_direct( - btree.get_cursor(c, leaf, extent.get_laddr()))); - }); - }); + co_return LBAMapping::create_direct(btree.get_cursor(c, leaf, extent.get_laddr())); } BtreeLBAManager::alloc_extent_ret