]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction_manager: rewrite remove_mappings_in_range with coroutine
authorXuehan Xu <xxhdx1985126@gmail.com>
Fri, 22 Aug 2025 14:59:09 +0000 (22:59 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Fri, 22 Aug 2025 14:59:09 +0000 (22:59 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/transaction_manager.h

index 6c60d8d13dc743dd05ae713a5ddb00b93d37747a..95ad4febd2b654ce1391654fe79be4ca3503c54e 100644 (file)
@@ -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();