]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/lba_mapping: add next() to get the next adjacent
authorXuehan Xu <xuxuehan@qianxin.com>
Thu, 19 Jun 2025 06:56:35 +0000 (14:56 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Thu, 31 Jul 2025 02:03:49 +0000 (10:03 +0800)
mapping

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/lba_mapping.cc
src/crimson/os/seastore/lba_mapping.h

index 63acafbb26210955eae7a20b4a8e0477ed9c0a9f..34d344a8e9d66404c10917a164032afb2db7d8be 100644 (file)
@@ -77,6 +77,30 @@ bool LBAMapping::is_data_stable() const {
     direct_cursor->key);
 }
 
+LBAMapping::next_iertr::future<LBAMapping> LBAMapping::next()
+{
+  LOG_PREFIX(LBAMapping::next);
+  auto ctx = get_effective_cursor().ctx;
+  SUBDEBUGT(seastore_lba, "{}", ctx.trans, *this);
+  return refresh().si_then([ctx](auto mapping) {
+    return with_btree_state<lba::LBABtree, LBAMapping>(
+      ctx.cache,
+      ctx,
+      std::move(mapping),
+      [ctx](auto &btree, auto &mapping) mutable {
+      auto &cursor = mapping.get_effective_cursor();
+      auto iter = btree.make_partial_iter(ctx, cursor);
+      return iter.next(ctx).si_then([ctx, &mapping](auto iter) {
+       if (!iter.is_end() && iter.get_val().pladdr.is_laddr()) {
+         mapping = LBAMapping::create_indirect(nullptr, iter.get_cursor(ctx));
+       } else {
+         mapping = LBAMapping::create_direct(iter.get_cursor(ctx));
+       }
+      });
+    });
+  });
+}
+
 LBAMapping::refresh_iertr::future<LBAMapping> LBAMapping::refresh()
 {
   if (is_viewable()) {
index beed476d88852923cf8b51bdb9e17d4dd01ca06c..f0dfb06ff78fb892c0d507d1ee065792cbbf0376 100644 (file)
@@ -134,6 +134,9 @@ public:
   using refresh_iertr = LBACursor::base_iertr;
   refresh_iertr::future<LBAMapping> refresh();
 
+  using next_iertr = LBACursor::base_iertr;
+  next_iertr::future<LBAMapping> next();
+
 private:
   friend lba::BtreeLBAManager;
   friend class TransactionManager;