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=b0a03090442be95c3e6fa1e77fde97cbc16ebae3;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 8c7022b9c49..9a22c241be6 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("{} + {}", t, laddr, remap.offset); val.pladdr = (laddr + remap.offset).checked_to_laddr(); } else { auto paddr = val.pladdr.get_paddr(); @@ -968,42 +970,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 7f0598d1098..e8f66280ed5 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 845dfbf4509..875bdc6f3ab 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 8b9eb9c90da..ce3e4b42bc2 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -1310,9 +1310,10 @@ private: remap.extent = extent.get(); } } - auto ret = co_await lba_manager->remap_mappings( + + auto cursors = co_await lba_manager->remap_mappings( t, - std::move(pin), + pin.get_effective_cursor_ref(), std::vector(remaps.begin(), remaps.end()) ).handle_error_interruptible( remap_pin_iertr::pass_further{}, @@ -1320,6 +1321,36 @@ private: "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; }