]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../lba_manager: add get_cursor interfaces
authorSamuel Just <sjust@redhat.com>
Fri, 26 Sep 2025 23:19:26 +0000 (16:19 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 10 Mar 2026 02:47:37 +0000 (19:47 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba/btree_lba_manager.cc
src/crimson/os/seastore/lba/btree_lba_manager.h
src/crimson/os/seastore/lba_manager.h

index 1595e949960a230591d70bc23a9d19ea103326d5..ac18c073868626375f96324e1b43cabe3f694e07 100644 (file)
@@ -117,6 +117,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<LBABtree>(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<LBABtree>(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<LogicalChildNode&>(
+      *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<LBABtree>(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,
@@ -148,7 +216,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));
   });
@@ -1194,7 +1262,7 @@ BtreeLBAManager::scan_mapped_space(
   }
 }
 
-BtreeLBAManager::_get_cursor_ret
+BtreeLBAManager::get_cursor_ret
 BtreeLBAManager::get_containing_cursor(
   op_context_t c,
   LBABtree &btree,
@@ -1204,7 +1272,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) {
index 92fd3533238d0605b19c50744a5e2c5ffeb45bdb..abaf7719929e48ffa51c200bde81d0bf4078c52c 100644 (file)
@@ -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;
@@ -633,19 +646,17 @@ private:
     });
   }
 
-  using _get_cursor_ret = get_mapping_iertr::future<LBACursorRef>;
-  _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<std::list<LBACursorRef>>;
-  _get_cursors_ret get_cursors(
+  get_cursors_ret get_cursors(
     op_context_t c,
     LBABtree& btree,
     laddr_t offset,
index 49182d6edcd40a2292436e2c5e986b97d415a95e..5dca57dbcfe0cdddc404ddc8b46a90c0a4a89184 100644 (file)
@@ -24,6 +24,9 @@
 
 namespace crimson::os::seastore {
 
+using LBACursor = lba::LBACursor;
+using LBACursorRef = lba::LBACursorRef;
+
 /**
  * Abstract interface for managing the logical to physical mapping
  */
@@ -35,6 +38,23 @@ public:
     Transaction &t
   ) = 0;
 
+  using get_cursors_iertr = base_iertr;
+  using get_cursors_ret = get_cursors_iertr::future<std::list<LBACursorRef>>;
+  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<LBACursorRef>;
+  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)
    *