From: Samuel Just Date: Fri, 3 Oct 2025 18:10:14 +0000 (+0000) Subject: crimson/.../transaction_manager: convert _remove_indirect_mapping to coroutine X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5ebacda4cdac31a8b69b43dc76a9833805e16a46;p=ceph-ci.git crimson/.../transaction_manager: convert _remove_indirect_mapping to coroutine Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 71cf025c92b..fa09f1f2715 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -267,78 +267,64 @@ TransactionManager::_remove_indirect_mapping( LBAMapping mapping) { LOG_PREFIX(TransactionManager::_remove_indirect_mapping); - return seastar::do_with( - std::move(mapping), - [&t, this, FNAME](auto &mapping) { - return lba_manager->complete_indirect_lba_mapping(t, std::move(mapping) - ).si_then([FNAME, &mapping, &t, this](auto m) { - mapping = std::move(m); - auto ret = get_extent_if_linked(t, mapping); - if (ret.index() == 1) { - return std::move(std::get<1>(ret) - ).si_then([&t, mapping, this, FNAME](auto extent) { - return lba_manager->remove_mapping(t, std::move(mapping) - ).si_then([this, FNAME, &t, extent](auto result) { - ceph_assert(result.direct_result); - auto &primary_result = result.result; - ceph_assert(primary_result.refcount == 0); - auto &direct_result = *result.direct_result; - ceph_assert(direct_result.addr.is_paddr()); - ceph_assert(!direct_result.addr.get_paddr().is_zero()); - ceph_assert(extent); - if (direct_result.refcount == 0) { - cache->retire_extent(t, extent); - } - DEBUGT("removed indirect mapping {}~0x{:x} refcount={} offset={} " - "with direct mapping {}~0x{:x} refcount={} offset={}", - t, primary_result.addr, - primary_result.length, - primary_result.refcount, - primary_result.key, - direct_result.addr, - direct_result.length, - direct_result.refcount, - direct_result.key); - return ref_iertr::make_ready_future< - _remove_mapping_result_t>(std::move(result)); - }); - }); - } else { - auto remove_direct = mapping.would_cascade_remove(); - if (remove_direct) { - auto unlinked_child = std::move(std::get<0>(ret)); - auto retired_placeholder = cache->retire_absent_extent_addr( - t, mapping.get_intermediate_base(), - mapping.get_val(), - mapping.get_intermediate_length() - )->template cast(); - unlinked_child.child_pos.link_child(retired_placeholder.get()); - } - return lba_manager->remove_mapping(t, std::move(mapping) - ).si_then([&t, FNAME, remove_direct](auto result) mutable { - ceph_assert(result.direct_result); - auto &primary_result = result.result; - ceph_assert(primary_result.refcount == 0); - auto &direct_result = *result.direct_result; - ceph_assert(direct_result.addr.is_paddr()); - ceph_assert(!direct_result.addr.get_paddr().is_zero()); - ceph_assert(remove_direct == (direct_result.refcount == 0)); - DEBUGT("removed indirect mapping {}~0x{:x} refcount={} offset={} " - "with direct mapping {}~0x{:x} refcount={} offset={}", - t, primary_result.addr, - primary_result.length, - primary_result.refcount, - primary_result.key, - direct_result.addr, - direct_result.length, - direct_result.refcount, - direct_result.key); - return ref_iertr::make_ready_future< - _remove_mapping_result_t>(std::move(result)); - }); - } - }); - }); + mapping = co_await lba_manager->complete_indirect_lba_mapping(t, std::move(mapping) + ); + auto ret = get_extent_if_linked(t, mapping); + if (ret.index() == 1) { + auto extent = co_await std::move(std::get<1>(ret)); + auto result = co_await lba_manager->remove_mapping(t, std::move(mapping)); + ceph_assert(result.direct_result); + auto &primary_result = result.result; + ceph_assert(primary_result.refcount == 0); + auto &direct_result = *result.direct_result; + ceph_assert(direct_result.addr.is_paddr()); + ceph_assert(!direct_result.addr.get_paddr().is_zero()); + ceph_assert(extent); + if (direct_result.refcount == 0) { + cache->retire_extent(t, extent); + } + DEBUGT("removed indirect mapping {}~0x{:x} refcount={} offset={} " + "with direct mapping {}~0x{:x} refcount={} offset={}", + t, primary_result.addr, + primary_result.length, + primary_result.refcount, + primary_result.key, + direct_result.addr, + direct_result.length, + direct_result.refcount, + direct_result.key); + co_return result; + } else { + auto remove_direct = mapping.would_cascade_remove(); + if (remove_direct) { + auto unlinked_child = std::move(std::get<0>(ret)); + auto retired_placeholder = cache->retire_absent_extent_addr( + t, mapping.get_intermediate_base(), + mapping.get_val(), + mapping.get_intermediate_length() + )->template cast(); + unlinked_child.child_pos.link_child(retired_placeholder.get()); + } + auto result = co_await lba_manager->remove_mapping(t, std::move(mapping)); + ceph_assert(result.direct_result); + auto &primary_result = result.result; + ceph_assert(primary_result.refcount == 0); + auto &direct_result = *result.direct_result; + ceph_assert(direct_result.addr.is_paddr()); + ceph_assert(!direct_result.addr.get_paddr().is_zero()); + ceph_assert(remove_direct == (direct_result.refcount == 0)); + DEBUGT("removed indirect mapping {}~0x{:x} refcount={} offset={} " + "with direct mapping {}~0x{:x} refcount={} offset={}", + t, primary_result.addr, + primary_result.length, + primary_result.refcount, + primary_result.key, + direct_result.addr, + direct_result.length, + direct_result.refcount, + direct_result.key); + co_return result; + } } TransactionManager::ref_iertr::future<