From: Samuel Just Date: Tue, 21 Oct 2025 21:59:58 +0000 (+0000) Subject: crimson/.../lba_manager: convert remap_mappings to use cursors X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7c1472bad8f747619f183515bedbe25d9f8f898c;p=ceph-ci.git crimson/.../lba_manager: convert remap_mappings to use cursors 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 f82628be3f3..9112ff20fd2 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -928,34 +928,36 @@ BtreeLBAManager::get_end_mapping( BtreeLBAManager::remap_ret BtreeLBAManager::remap_mappings( Transaction &t, - LBAMapping mapping, + LBACursorRef cursor, std::vector remaps) { LOG_PREFIX(BtreeLBAManager::remap_mappings); - DEBUGT("{}", t, mapping); - assert(mapping.is_viewable()); - assert(mapping.is_indirect() == mapping.is_complete_indirect()); + DEBUGT("{}", t, *cursor); + assert(cursor->is_viewable()); + auto orig_indirect = cursor->is_indirect(); + auto orig_laddr = cursor->get_laddr(); + auto orig_len = cursor->get_length(); auto c = get_context(t); auto btree = co_await get_btree(cache, c); - auto iter = btree.make_partial_iter(c, mapping.get_effective_cursor()); - std::vector ret; - auto val = iter.get_val(); - assert(val.refcount == EXTENT_DEFAULT_REF_COUNT); - assert(mapping.is_indirect() || - (val.pladdr.is_paddr() && - val.pladdr.get_paddr().is_absolute())); - auto updated_cursor = co_await update_mapping_refcount( - c.trans, mapping.get_effective_cursor_ref(), -1); - iter = btree.make_partial_iter(c, *updated_cursor); + auto iter = btree.make_partial_iter(c, *cursor); + auto orig_val = iter.get_val(); + std::vector ret; + assert(orig_val.refcount == EXTENT_DEFAULT_REF_COUNT); + assert(orig_indirect || + (orig_val.pladdr.is_paddr() && + orig_val.pladdr.get_paddr().is_absolute())); + cursor = co_await update_mapping_refcount( + c.trans, cursor, -1); + iter = btree.make_partial_iter(c, *cursor); for (auto &remap : remaps) { - assert(remap.offset + remap.len <= mapping.get_length()); - assert((bool)remap.extent == !mapping.is_indirect()); - lba_map_val_t val; - auto old_key = mapping.get_key(); - auto new_key = (old_key + remap.offset).checked_to_laddr(); + assert(remap.offset + remap.len <= orig_len); + assert((bool)remap.extent == !orig_indirect); + lba_map_val_t val = orig_val; + auto new_key = (orig_laddr + remap.offset).checked_to_laddr(); val.len = remap.len; if (val.pladdr.is_laddr()) { auto laddr = val.pladdr.get_laddr(); + DEBUGT("{} + {:#x}", t, laddr, remap.offset); val.pladdr = (laddr + remap.offset).checked_to_laddr(); } else { auto paddr = val.pladdr.get_paddr(); @@ -969,42 +971,21 @@ BtreeLBAManager::remap_mappings( auto &[it, inserted] = p; ceph_assert(inserted); auto &leaf_node = *it.get_leaf_node(); - if (mapping.is_indirect()) { + if (orig_indirect) { leaf_node.insert_child_ptr( it.get_leaf_pos(), get_reserved_ptr(), leaf_node.get_size() - 1 /*the size before the insert*/); - ret.push_back( - LBAMapping::create_indirect(nullptr, it.get_cursor(c))); + ret.push_back(it.get_cursor(c)); } else { leaf_node.insert_child_ptr( it.get_leaf_pos(), remap.extent, leaf_node.get_size() - 1 /*the size before the insert*/); - ret.push_back( - LBAMapping::create_direct(it.get_cursor(c))); + ret.push_back(it.get_cursor(c)); } - it = co_await it.next(c); - iter = std::move(it); + iter = co_await it.next(c); } - if (mapping.is_indirect()) { - co_await mapping.direct_cursor->refresh(); - for (auto &m : ret) { - m.direct_cursor = mapping.direct_cursor; - } - } - if (remaps.size() > 1 && mapping.is_indirect()) { - assert(mapping.direct_cursor->is_viewable()); - co_await update_mapping_refcount(c.trans, mapping.direct_cursor, 1); - } - co_await trans_intr::parallel_for_each( - ret, - [](auto &remapped_mapping) { - return remapped_mapping.refresh( - ).si_then([&remapped_mapping](auto mapping) { - remapped_mapping = std::move(mapping); - }); - }); co_return ret; } diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index 0bcc3f59c8c..508209b8e6d 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -198,7 +198,7 @@ public: remap_ret remap_mappings( Transaction &t, - LBAMapping mapping, + LBACursorRef mapping, std::vector remaps) final; /** diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index 8bded2f42cd..f4a10befde3 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -156,7 +156,7 @@ public: {} }; using remap_iertr = ref_iertr; - using remap_ret = remap_iertr::future>; + using remap_ret = remap_iertr::future>; /** * remap_mappings @@ -166,7 +166,7 @@ public: */ virtual remap_ret remap_mappings( Transaction &t, - LBAMapping orig_mapping, + LBACursorRef orig_mapping, std::vector remaps ) = 0; diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index ca73d94a008..4aa4763cce2 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -1322,19 +1322,50 @@ private: remapped_extent->set_seen_by_users(); remap.extent = remapped_extent.get(); } - } - - SUBTRACET(seastore_tm, "remapping pins...", t); - auto mapping_vec = co_await lba_manager->remap_mappings( - t, - pin, - std::vector(remaps.begin(), remaps.end()) - ).handle_error_interruptible(remap_pin_iertr::pass_further{}, - crimson::ct_error::assert_all{ - "TransactionManager::remap_pin hit invalid error"} - ); - SUBDEBUGT(seastore_tm, "remapped {} pins", t, mapping_vec.size()); - co_return std::move(mapping_vec); + } + + auto cursors = co_await lba_manager->remap_mappings( + t, + pin.get_effective_cursor_ref(), + std::vector(remaps.begin(), remaps.end()) + ).handle_error_interruptible( + remap_pin_iertr::pass_further{}, + crimson::ct_error::assert_all{ + "TransactionManager::remap_pin hit invalid error" + } + ); + + std::vector ret; + if (pin.is_indirect()) { + co_await pin.direct_cursor->refresh(); + for (auto &cursor : cursors) { + ret.push_back( + LBAMapping::create_indirect( + pin.direct_cursor, + cursor)); + } + } else { + for (auto &cursor : cursors) { + ret.push_back( + LBAMapping::create_direct( + cursor)); + } + } + if (remaps.size() > 1 && pin.is_indirect()) { + assert(pin.direct_cursor->is_viewable()); + co_await lba_manager->update_mapping_refcount( + t, pin.direct_cursor, 1); + } + co_await trans_intr::parallel_for_each( + ret, + [](auto &remapped_mapping) { + return remapped_mapping.refresh( + ).si_then([&remapped_mapping](auto mapping) { + remapped_mapping = std::move(mapping); + }); + }); + SUBDEBUGT(seastore_tm, "remapped {} pins", t, ret.size()); + co_return ret; } ref_iertr::future _remove(