From 996d5d3d4dbd1ffc2e9e5504fad6aa8bbbaf8372 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 22 Aug 2025 22:59:09 +0800 Subject: [PATCH] crimson/os/seastore/transaction_manager: rewrite remove_mappings_in_range with coroutine Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/transaction_manager.h | 45 +++++++------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 6c60d8d13dc74..95ad4febd2b65 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -1116,36 +1116,23 @@ public: LOG_PREFIX(TransactionManager::remove_mappings_in_range); SUBDEBUGT(seastore_tm, "{}~{}, first_mapping: {}", t, start, unaligned_len, first_mapping); - // remove all middle mappings - return seastar::do_with( - std::move(first_mapping), - [&t, this, start, unaligned_len](auto &mapping) { - return trans_intr::repeat([&t, this, start, unaligned_len, &mapping] { - if (mapping.is_end()) { - return punch_mappings_iertr::make_ready_future< - seastar::stop_iteration>(seastar::stop_iteration::yes); - } - assert(mapping.get_key() >= start); - auto mapping_end = - (mapping.get_key() + mapping.get_length()).checked_to_laddr(); - if (mapping_end > start + unaligned_len) { - return punch_mappings_iertr::make_ready_future< - seastar::stop_iteration>(seastar::stop_iteration::yes); + auto mapping = co_await first_mapping.refresh(); + while (!mapping.is_end()) { + assert(mapping.get_key() >= start); + auto mapping_end = + (mapping.get_key() + mapping.get_length()).checked_to_laddr(); + if (mapping_end > start + unaligned_len) { + break; + } + mapping = co_await remove(t, std::move(mapping) + ).handle_error_interruptible( + punch_mappings_iertr::pass_further{}, + crimson::ct_error::assert_all{ + "remove_mappings_in_range hit invalid error" } - return remove(t, std::move(mapping) - ).si_then([&mapping](auto next_mapping) { - mapping = std::move(next_mapping); - return seastar::stop_iteration::no; - }).handle_error_interruptible( - punch_mappings_iertr::pass_further{}, - crimson::ct_error::assert_all{ - "remove_mappings_in_range hit invalid error" - } - ); - }).si_then([&mapping] { - return std::move(mapping); - }); - }); + ); + } + co_return std::move(mapping); } ~TransactionManager(); -- 2.39.5