]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/.../lba_manager: convert clone_mapping to use cursors
authorSamuel Just <sjust@redhat.com>
Thu, 16 Oct 2025 01:26:52 +0000 (01:26 +0000)
committerSamuel Just <sjust@redhat.com>
Tue, 2 Dec 2025 23:12:58 +0000 (15:12 -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
src/crimson/os/seastore/transaction_manager.h

index ff5a7f5081ec11b7360f6b048a2a05cb8ec62406..5f43bf974e84249b1b40685301dff9bd481dc910 100644 (file)
@@ -312,46 +312,30 @@ BtreeLBAManager::alloc_extents(
 BtreeLBAManager::clone_mapping_ret
 BtreeLBAManager::clone_mapping(
   Transaction &t,
-  LBAMapping pos,
-  LBAMapping mapping,
+  LBACursorRef pos,
+  LBACursorRef mapping,
   laddr_t laddr,
   extent_len_t offset,
   extent_len_t len,
   bool updateref)
 {
   LOG_PREFIX(BtreeLBAManager::clone_mapping);
-  assert(pos.is_viewable());
-  assert(mapping.is_viewable());
+  assert(pos->is_viewable());
+  assert(mapping->is_viewable());
   DEBUGT("pos={}, mapping={}, laddr={}, {}~{} updateref={}",
-    t, pos, mapping, laddr, offset, len, updateref);
-  assert(offset + len <= mapping.get_length());
+    t, *pos, *mapping, laddr, offset, len, updateref);
+  assert(offset + len <= mapping->get_length());
   auto c = get_context(t);
   if (updateref) {
-    if (!mapping.direct_cursor) {
-      mapping.direct_cursor = co_await resolve_indirect_cursor(
-       c, *mapping.indirect_cursor);
-    }
-    assert(mapping.direct_cursor->is_viewable());
-    auto res = co_await update_refcount(
-      c.trans, mapping.direct_cursor.get(), 1
-    ).handle_error_interruptible(
-      clone_mapping_iertr::pass_further{},
-      crimson::ct_error::assert_all{"unexpected error"}
-    );
-    assert(!res.mapping.is_indirect());
-    mapping.direct_cursor = std::move(res.mapping.direct_cursor);
+    mapping = co_await update_mapping_refcount(c.trans, mapping, 1);
   }
   auto btree = co_await get_btree<LBABtree>(cache, c);
-  auto &cursor = pos.get_effective_cursor();
-  co_await cursor.refresh();
-  assert(laddr + len <= cursor.key);
-  auto inter_key = mapping.is_indirect()
-    ? mapping.get_intermediate_key()
-    : mapping.get_key();
-  inter_key = (inter_key + offset).checked_to_laddr();
+  co_await pos->refresh();
+  assert(laddr + len <= pos->get_laddr());
+  auto inter_key = (mapping->get_laddr() + offset).checked_to_laddr();
   auto p = co_await btree.insert(
     c,
-    btree.make_partial_iter(c, cursor),
+    btree.make_partial_iter(c, *pos),
     laddr,
     lba_map_val_t{len, inter_key, EXTENT_DEFAULT_REF_COUNT, 0});
   auto &[iter, inserted] = p;
@@ -360,9 +344,9 @@ BtreeLBAManager::clone_mapping(
     iter.get_leaf_pos(),
     get_reserved_ptr<LBALeafNode, laddr_t>(),
     leaf_node.get_size() - 1 /*the size before the insert*/);
-  mapping = co_await mapping.refresh();
+  co_await mapping->refresh();
   co_return clone_mapping_ret_t{
-    LBAMapping(mapping.direct_cursor, iter.get_cursor(c)),
+    iter.get_cursor(c),
     mapping};
 }
 
index bb0e8bb00a7ed1a2a9bd7834dc3009fed0393b30..aceb24ae14b25bab147fa7e351b5930e5c6681bc 100644 (file)
@@ -96,8 +96,8 @@ public:
 
   clone_mapping_ret clone_mapping(
     Transaction &t,
-    LBAMapping pos,
-    LBAMapping mapping,
+    LBACursorRef pos,
+    LBACursorRef mapping,
     laddr_t laddr,
     extent_len_t offset,
     extent_len_t len,
index ec4adb414712a5d3ae17036846ed28ae6fda9370..505f53950a4e2816d849412a77a82ace86a9dd9d 100644 (file)
@@ -91,8 +91,8 @@ public:
     std::vector<LogicalChildNodeRef> ext) = 0;
 
   struct clone_mapping_ret_t {
-    LBAMapping cloned_mapping;
-    LBAMapping orig_mapping;
+    LBACursorRef cloned_mapping;
+    LBACursorRef orig_mapping;
   };
   using clone_mapping_iertr = alloc_extent_iertr;
   using clone_mapping_ret = clone_mapping_iertr::future<clone_mapping_ret_t>;
@@ -101,8 +101,8 @@ public:
    */
   virtual clone_mapping_ret clone_mapping(
     Transaction &t,
-    LBAMapping pos,            // the destined position
-    LBAMapping mapping,                // the mapping to be cloned
+    LBACursorRef pos,          // the destined position
+    LBACursorRef mapping,      // the mapping to be cloned
     laddr_t laddr,             // the new lba key of the cloned mapping
     extent_len_t offset,       // the offset of the part to be cloned,
                                // relative to the start of the mapping.
index 4aeaaa3bf0c1e0835981201c6c23ddbc30d5d668..25a1d24821ad3accab2ddfd8df4af12f89b56142 100644 (file)
@@ -551,8 +551,12 @@ public:
    * for the definition of "indirect lba mapping" and "direct lba mapping".
    * Note that the cloned extent must be stable
    */
-  using clone_extent_iertr = LBAManager::clone_mapping_iertr;
-  using clone_extent_ret = LBAManager::clone_mapping_ret;
+  struct clone_pin_ret {
+    LBAMapping cloned_mapping;
+    LBAMapping orig_mapping;
+  };
+  using clone_extent_iertr = base_iertr;
+  using clone_extent_ret = clone_extent_iertr::future<clone_pin_ret>;
   clone_extent_ret clone_pin(
     Transaction &t,
     LBAMapping pos,
@@ -564,19 +568,23 @@ public:
     LOG_PREFIX(TransactionManager::clone_pin);
     SUBDEBUGT(seastore_tm, "{} clone to hint {} ... pos={}, updateref={}",
       t, mapping, hint, pos, updateref);
+    ceph_assert(!pos.is_indirect());
     pos = co_await pos.refresh();
-    mapping = co_await mapping.refresh();
+    mapping = co_await complete_mapping(t, mapping);
     auto ret = co_await lba_manager->clone_mapping(
       t,
-      std::move(pos),
-      std::move(mapping),
+      std::move(pos.direct_cursor),
+      std::move(mapping.direct_cursor),
       hint,
       offset,
       len,
       updateref
     );
-    SUBDEBUGT(seastore_tm, "cloned as {}", t, ret.cloned_mapping);
-    co_return ret;
+    SUBDEBUGT(seastore_tm, "cloned as {}", t, *ret.cloned_mapping);
+    co_return clone_pin_ret{
+      LBAMapping::create_indirect(ret.orig_mapping, ret.cloned_mapping),
+      LBAMapping(ret.orig_mapping, std::move(mapping.indirect_cursor))
+    };
   }
 
   struct clone_range_ret_t {