]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../transaction_manager: introduce resolve_cursor_to_mapping
authorSamuel Just <sjust@redhat.com>
Tue, 30 Sep 2025 17:52:45 +0000 (10:52 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 10 Mar 2026 17:11:30 +0000 (10:11 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index a5fde3ae47a662cb0fe634b7a4deb5fdb33d6c0b..e74c1b1c723a3ad650035f7ec6b8118901008b49 100644 (file)
@@ -424,6 +424,43 @@ TransactionManager::_remove(
   }
 }
 
+using resolve_cursor_to_mapping_iertr = base_iertr;
+resolve_cursor_to_mapping_iertr::future<LBAMapping>
+TransactionManager::resolve_cursor_to_mapping(
+  Transaction &t,
+  LBACursorRef cursor)
+{
+  LOG_PREFIX(TransactionManager::resolve_cursor_to_mapping);
+  co_await cursor->refresh();
+  if (cursor->is_end() || !cursor->is_indirect()) {
+    auto ret = co_await LBAMapping::create_direct(cursor).refresh();
+    DEBUGT("{} -> {}", t, *cursor, ret);
+    co_return ret;
+  }
+
+  assert(cursor->get_refcount() == EXTENT_DEFAULT_REF_COUNT);
+  assert(cursor->get_checksum() == 0);
+
+  auto direct_cursors = co_await lba_manager->get_cursors(
+    t,
+    cursor->get_intermediate_key(),
+    cursor->get_length()
+  );
+
+  ceph_assert(direct_cursors.size() == 1);
+  auto& direct_cursor = direct_cursors.front();
+  auto intermediate_key = cursor->get_intermediate_key();
+  assert(!direct_cursor->is_indirect());
+  assert(direct_cursor->get_laddr() <= intermediate_key);
+  assert(direct_cursor->get_laddr() + direct_cursor->get_length()
+        >= intermediate_key + cursor->get_length());
+  auto ret = co_await LBAMapping::create_indirect(
+    std::move(direct_cursor),
+    cursor).refresh();
+  DEBUGT("{} -> {}", t, *cursor, ret);
+  co_return ret;
+}
+
 TransactionManager::refs_ret TransactionManager::remove(
   Transaction &t,
   std::vector<laddr_t> offsets)
index 3fdf27f9ac04d9e789e34a7d8cb2fbbe775fbe2b..8c07a9242600493cd6bf13c9f1edef14a81ca20e 100644 (file)
@@ -1159,6 +1159,12 @@ private:
     return cache->can_drop_backref();
   }
 
+  using resolve_cursor_to_mapping_iertr = base_iertr;
+  resolve_cursor_to_mapping_iertr::future<LBAMapping>
+  resolve_cursor_to_mapping(
+    Transaction &t,
+    LBACursorRef cursor);
+
   using LBALeafNode = lba::LBALeafNode;
   struct unlinked_child_t {
     LBAMapping mapping;