]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.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, 9 Dec 2025 18:24:10 +0000 (10:24 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index a38125bd57f853c2a2f65f32bddc38d79c4c0f62..35ef1cd0f4b864a6da660d1bfb649ab43a4a12ce 100644 (file)
@@ -409,6 +409,37 @@ 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)
+{
+  if (cursor->is_end() || !cursor->is_indirect()) {
+    co_return co_await LBAMapping::create_direct(std::move(cursor)).refresh();
+  }
+
+  assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT);
+  assert(cursor->val->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());
+  co_return co_await LBAMapping::create_indirect(
+    std::move(direct_cursor),
+    std::move(cursor)).refresh();
+}
+
 TransactionManager::refs_ret TransactionManager::remove(
   Transaction &t,
   std::vector<laddr_t> offsets)
index 816b760fe2845eb5151d10f08221c7e14b21a7a4..9fb19caf72b687e4f27cd792550bfae9a4626a0c 100644 (file)
@@ -1155,6 +1155,12 @@ private:
 
   shard_stats_t& shard_stats;
 
+  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;