]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/../btree_lba_manager: get_mapping() to reuse get_indirect_pin()
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 2 Apr 2025 07:57:22 +0000 (15:57 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 3 Apr 2025 02:20:27 +0000 (10:20 +0800)
There is no guarantee that the direct pin must match exactly.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h

index be05a76bb8a1ea5caec66ec12a6d58ecf2b93c7f..cc56775c416857dbd59b368a93a31efdf8b85b6f 100644 (file)
@@ -176,18 +176,14 @@ BtreeLBAManager::get_mappings(
           auto key = pin->get_key();
           auto intermediate_key = pin->get_raw_val().get_laddr();
           auto intermediate_len = pin->get_length();
-          return _get_mappings(c, btree, intermediate_key, intermediate_len
-          ).si_then([FNAME, c, laddr, length, key, intermediate_key,
-                     intermediate_len, &ret](auto pin_list) {
-            ceph_assert(pin_list.size() == 1);
-            auto& pin = pin_list.front();
-            assert(!pin->is_indirect());
-            assert(pin->get_key() <= intermediate_key);
-            assert(pin->get_key() + pin->get_length() >= intermediate_key + intermediate_len);
+          return get_indirect_pin(c, btree, key, intermediate_key, intermediate_len
+          ).si_then([FNAME, c, &ret, laddr, length](auto pin) {
             TRACET("{}~0x{:x} got indirect pin {}~0x{:x}->{}({}~0x{:x})",
-                   c.trans, laddr, length, key, intermediate_len, intermediate_key,
-                   pin->get_key(), pin->get_length());
-            pin->make_indirect(key, intermediate_len, intermediate_key);
+                   c.trans, laddr, length,
+                   pin->get_key(), pin->get_length(),
+                   pin->get_intermediate_key(),
+                   pin->get_intermediate_base(),
+                   pin->get_intermediate_length());
             ret.emplace_back(std::move(pin));
             return get_mappings_iertr::now();
           });
@@ -235,6 +231,28 @@ BtreeLBAManager::_get_mappings(
   });
 }
 
+BtreeLBAManager::get_indirect_pin_ret
+BtreeLBAManager::get_indirect_pin(
+  op_context_t<laddr_t> c,
+  LBABtree& btree,
+  laddr_t key,
+  laddr_t intermediate_key,
+  extent_len_t length)
+{
+  return _get_mappings(c, btree, intermediate_key, length
+  ).si_then([key, intermediate_key, length](auto pin_list) {
+    ceph_assert(pin_list.size() == 1);
+    auto& pin = pin_list.front();
+    assert(!pin->is_indirect());
+    assert(pin->get_key() <= intermediate_key);
+    assert(pin->get_key() + pin->get_length() >= intermediate_key + length);
+    pin->make_indirect(key, length, intermediate_key);
+    assert(pin->get_key() == key);
+    assert(pin->get_length() == length);
+    return std::move(pin);
+  });
+}
+
 BtreeLBAManager::get_mapping_ret
 BtreeLBAManager::get_mapping(
   Transaction &t,
@@ -257,12 +275,14 @@ BtreeLBAManager::get_mapping(
       assert(laddr == pin->get_key());
       auto len = pin->get_length();
       laddr_t direct_laddr = pin->get_raw_val().get_laddr();
-      return _get_mapping(c, btree, direct_laddr
-      ).si_then([FNAME, c, laddr, len](auto pin) {
-        ceph_assert(len == pin->get_length());
-        TRACET("{} got indirect pin->{}~0x{:x}",
-               c.trans, laddr, pin->get_key(), len);
-        pin->make_indirect(laddr, len);
+      return get_indirect_pin(c, btree, laddr, direct_laddr, len
+      ).si_then([FNAME, c, laddr](auto pin) {
+        TRACET("{} got indirect pin {}~0x{:x}->{}({}~0x{:x})",
+               c.trans, laddr,
+               pin->get_key(), pin->get_length(),
+               pin->get_intermediate_key(),
+               pin->get_intermediate_base(),
+               pin->get_intermediate_length());
         return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
       });
     });
index ed990330918695b87d18762e1fcd47743303493d..56f8a1d6fc4c37b14cd480881b470ff498cbcc1c 100644 (file)
@@ -713,6 +713,14 @@ private:
     laddr_t offset,
     extent_len_t length);
 
+  using get_indirect_pin_ret = get_mappings_iertr::future<BtreeLBAMappingRef>;
+  get_indirect_pin_ret get_indirect_pin(
+    op_context_t<laddr_t> c,
+    LBABtree& btree,
+    laddr_t key,
+    laddr_t intermediate_key,
+    extent_len_t length);
+
   using _decref_intermediate_ret = ref_iertr::future<
     std::optional<ref_update_result_t>>;
   _decref_intermediate_ret _decref_intermediate(