From: Samuel Just Date: Tue, 30 Sep 2025 17:52:45 +0000 (-0700) Subject: crimson/.../transaction_manager: introduce resolve_cursor_to_mapping X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=71da6961d6d032554e2b0bc96b0e821f816fe358;p=ceph-ci.git crimson/.../transaction_manager: introduce resolve_cursor_to_mapping Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 83324b9a819..9ee07368557 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -409,6 +409,37 @@ TransactionManager::_remove( } } +using resolve_cursor_to_mapping_iertr = base_iertr; +resolve_cursor_to_mapping_iertr::future +TransactionManager::resolve_cursor_to_mapping( + Transaction &t, + LBACursorRef cursor) +{ + if (cursor->is_end() || !cursor->is_indirect()) { + co_return co_await LBAMapping::create_direct(std::move(cursor)).refresh(); + } + + assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT); + assert(cursor->val->checksum == 0); + + auto direct_cursors = co_await lba_manager->get_cursors( + t, + cursor->get_intermediate_key(), + cursor->get_length() + ); + + ceph_assert(direct_cursors.size() == 1); + auto& direct_cursor = direct_cursors.front(); + auto intermediate_key = cursor->get_intermediate_key(); + assert(!direct_cursor->is_indirect()); + assert(direct_cursor->get_laddr() <= intermediate_key); + assert(direct_cursor->get_laddr() + direct_cursor->get_length() + >= intermediate_key + cursor->get_length()); + co_return co_await LBAMapping::create_indirect( + std::move(direct_cursor), + std::move(cursor)).refresh(); +} + TransactionManager::refs_ret TransactionManager::remove( Transaction &t, std::vector offsets) diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 5f3eb173e97..cb0a20120ed 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -1153,6 +1153,12 @@ private: shard_stats_t& shard_stats; + using resolve_cursor_to_mapping_iertr = base_iertr; + resolve_cursor_to_mapping_iertr::future + resolve_cursor_to_mapping( + Transaction &t, + LBACursorRef cursor); + using LBALeafNode = lba::LBALeafNode; struct unlinked_child_t { LBAMapping mapping;