]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.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>
Mon, 5 Jan 2026 20:44:37 +0000 (12:44 -0800)
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 e2bed222eb803468eb360e20f21946ceed35c60a..2acd5fddb18b002b8b34005775222a3d75fdb520 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,
@@ -465,7 +533,7 @@ BtreeLBAManager::clone_mapping(
   );
 }
 
-BtreeLBAManager::_get_cursor_ret
+BtreeLBAManager::get_cursor_ret
 BtreeLBAManager::get_cursor(
   op_context_t c,
   LBABtree& btree,
@@ -475,13 +543,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));
   });
@@ -1138,7 +1206,7 @@ BtreeLBAManager::_update_mapping(
     });
 }
 
-BtreeLBAManager::_get_cursor_ret
+BtreeLBAManager::get_cursor_ret
 BtreeLBAManager::get_containing_cursor(
   op_context_t c,
   LBABtree &btree,
@@ -1148,7 +1216,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 d2b460ca62ecc026851f840c368f3c82fc72b672..721770d2223adfa8d1be785741ad33cfab6ab9d8 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;
@@ -620,19 +633,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 33b9facada13f36153d7f92f3ba829fe4fd59055..078de81914f7e050968f53bb3a6789590fc9887f 100644 (file)
@@ -35,6 +35,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)
    *