From: Samuel Just Date: Fri, 26 Sep 2025 23:19:26 +0000 (-0700) Subject: crimson/.../lba_manager: add get_cursor interfaces X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4d95658179fbb73f648b3e8e8ea7e72589d60202;p=ceph-ci.git crimson/.../lba_manager: add get_cursor interfaces 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 eac53daa7ea..8c6895b5d32 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -116,6 +116,74 @@ BtreeLBAManager::mkfs( croot->get_root().lba_root = LBABtree::mkfs(croot, get_context(t)); } +BtreeLBAManager::get_cursors_ret +BtreeLBAManager::get_cursors( + Transaction &t, + laddr_t laddr, + extent_len_t length) +{ + LOG_PREFIX(BtreeLBAManager::get_cursors); + TRACET("{}~0x{:x} ...", t, laddr, length); + auto c = get_context(t); + + auto btree = co_await get_btree(cache, c); + co_return co_await get_cursors(c, btree, laddr, length); +} + +BtreeLBAManager::get_cursor_ret +BtreeLBAManager::get_cursor( + Transaction &t, + laddr_t laddr, + bool search_containing) +{ + LOG_PREFIX(BtreeLBAManager::get_cursor); + TRACET("{} ... search_containing={}", t, laddr, search_containing); + auto c = get_context(t); + auto btree = co_await get_btree(cache, c); + + if (search_containing) { + auto ret = co_await get_containing_cursor(c, btree, laddr); + assert(ret->contains(laddr)); + co_return ret; + } else { + auto ret = co_await get_cursor(c, btree, laddr); + assert(laddr == ret->get_laddr()); + co_return ret; + } +} + +BtreeLBAManager::get_cursor_ret +BtreeLBAManager::get_cursor( + Transaction &t, + LogicalChildNode &extent) +{ + LOG_PREFIX(BtreeLBAManager::get_cursor); + TRACET("{}", t, extent); +#ifndef NDEBUG + if (extent.is_mutation_pending()) { + auto &prior = static_cast( + *extent.get_prior_instance()); + assert(prior.peek_parent_node()->is_valid()); + } else { + assert(extent.peek_parent_node()->is_valid()); + } +#endif + auto c = get_context(t); + auto btree = co_await get_btree(cache, c); + + auto leaf = co_await extent.get_parent_node(c.trans, c.cache); + + if (leaf->is_pending()) { + TRACET("find pending extent {} for {}", + c.trans, (void*)leaf.get(), extent); + } +#ifndef NDEBUG + auto it = leaf->lower_bound(extent.get_laddr()); + assert(it != leaf->end() && it.get_key() == extent.get_laddr()); +#endif + co_return btree.get_cursor(c, leaf, extent.get_laddr()); +} + BtreeLBAManager::get_mappings_ret BtreeLBAManager::get_mappings( Transaction &t, @@ -147,7 +215,7 @@ BtreeLBAManager::get_mappings( co_return ret; } -BtreeLBAManager::_get_cursors_ret +BtreeLBAManager::get_cursors_ret BtreeLBAManager::get_cursors( op_context_t c, LBABtree& btree, @@ -464,7 +532,7 @@ BtreeLBAManager::clone_mapping( ); } -BtreeLBAManager::_get_cursor_ret +BtreeLBAManager::get_cursor_ret BtreeLBAManager::get_cursor( op_context_t c, LBABtree& btree, @@ -474,13 +542,13 @@ BtreeLBAManager::get_cursor( TRACET("{} ...", c.trans, laddr); return btree.lower_bound( c, laddr - ).si_then([FNAME, c, laddr](auto iter) -> _get_cursor_ret { + ).si_then([FNAME, c, laddr](auto iter) -> get_cursor_ret { if (iter.is_end() || iter.get_key() != laddr) { ERRORT("{} doesn't exist", c.trans, laddr); return crimson::ct_error::enoent::make(); } TRACET("{} got value {}", c.trans, laddr, iter.get_val()); - return _get_cursor_ret( + return get_cursor_ret( interruptible::ready_future_marker{}, iter.get_cursor(c)); }); @@ -1137,7 +1205,7 @@ BtreeLBAManager::_update_mapping( }); } -BtreeLBAManager::_get_cursor_ret +BtreeLBAManager::get_cursor_ret BtreeLBAManager::get_containing_cursor( op_context_t c, LBABtree &btree, @@ -1147,7 +1215,7 @@ BtreeLBAManager::get_containing_cursor( TRACET("{}", c.trans, laddr); return btree.upper_bound_right(c, laddr ).si_then([c, laddr, FNAME](LBABtree::iterator iter) - -> _get_cursor_ret { + -> get_cursor_ret { if (iter.is_end() || iter.get_key() > laddr || iter.get_key() + iter.get_val().len <=laddr) { diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index 33b6ea87ce0..b27ea555f49 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -62,6 +62,19 @@ public: mkfs_ret mkfs( Transaction &t) final; + get_cursors_ret get_cursors( + Transaction &t, + laddr_t offset, extent_len_t length) final; + + get_cursor_ret get_cursor( + Transaction &t, + laddr_t offset, + bool search_containing = false) final; + + get_cursor_ret get_cursor( + Transaction &t, + LogicalChildNode &extent) final; + get_mappings_ret get_mappings( Transaction &t, laddr_t offset, extent_len_t length) final; @@ -620,19 +633,17 @@ private: }); } - using _get_cursor_ret = get_mapping_iertr::future; - _get_cursor_ret get_cursor( + get_cursor_ret get_cursor( op_context_t c, LBABtree& btree, laddr_t offset); - _get_cursor_ret get_containing_cursor( + get_cursor_ret get_containing_cursor( op_context_t c, LBABtree &btree, laddr_t laddr); - using _get_cursors_ret = get_mappings_iertr::future>; - _get_cursors_ret get_cursors( + get_cursors_ret get_cursors( op_context_t c, LBABtree& btree, laddr_t offset, diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index 1b1d37bfdc1..53773119d82 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -35,6 +35,23 @@ public: Transaction &t ) = 0; + using get_cursors_iertr = base_iertr; + using get_cursors_ret = get_cursors_iertr::future>; + virtual get_cursors_ret get_cursors( + Transaction &t, + laddr_t offset, extent_len_t length) = 0; + + using get_cursor_iertr = base_iertr::extend< + crimson::ct_error::enoent>; + using get_cursor_ret = get_cursor_iertr::future; + virtual get_cursor_ret get_cursor( + Transaction &t, + laddr_t offset, + bool search_containing = false) = 0; + virtual get_cursor_ret get_cursor( + Transaction &t, + LogicalChildNode &extent) = 0; + /** * Fetches mappings for laddr_t in range [offset, offset + len) *