]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: alloc mapping with refcount when rewriting logical extents 56627/head
authorZhang Song <zhangsong02@qianxin.com>
Wed, 3 Apr 2024 09:21:43 +0000 (17:21 +0800)
committerZhang Song <zhangsong02@qianxin.com>
Wed, 3 Apr 2024 09:40:55 +0000 (17:40 +0800)
Signed-off-by: Zhang Song <zhangsong02@qianxin.com>
src/crimson/os/seastore/lba_manager.cc
src/crimson/os/seastore/lba_manager.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/transaction_manager.cc

index c3473bc483eba4fd2962441885f457f64fdf4c57..466fa8bd06297def84d9d6e44d3e3e53a6cc76cf 100644 (file)
@@ -22,7 +22,7 @@ LBAManager::update_mappings(
       extent->get_paddr(),
       nullptr  // all the extents should have already been
                // added to the fixed_kv_btree
-    );
+    ).discard_result();
   });
 }
 
index df873a97a16ac980ec6dc7cf17008e80bb6a3fca..3fa0987e150af8281a1bd7465f6e7c2694564dba 100644 (file)
@@ -87,7 +87,8 @@ public:
     laddr_t hint,
     extent_len_t len,
     paddr_t addr,
-    LogicalCachedExtent &nextent) = 0;
+    LogicalCachedExtent &nextent,
+    extent_ref_count_t refcount = EXTENT_DEFAULT_REF_COUNT) = 0;
 
   virtual alloc_extent_ret clone_mapping(
     Transaction &t,
@@ -187,7 +188,7 @@ public:
    * update lba mapping for a delayed allocated extent
    */
   using update_mapping_iertr = base_iertr;
-  using update_mapping_ret = base_iertr::future<>;
+  using update_mapping_ret = base_iertr::future<extent_ref_count_t>;
   virtual update_mapping_ret update_mapping(
     Transaction& t,
     laddr_t laddr,
@@ -203,7 +204,7 @@ public:
    * update lba mappings for delayed allocated extents
    */
   using update_mappings_iertr = update_mapping_iertr;
-  using update_mappings_ret = update_mapping_ret;
+  using update_mappings_ret = update_mappings_iertr::future<>;
   update_mappings_ret update_mappings(
     Transaction& t,
     const std::list<LogicalCachedExtentRef>& extents);
index 6bce91ffe50f396f29128ba8112cbba93d28ed31..d2a8b3dc0cbdddd5270bb827713d7445de6715db 100644 (file)
@@ -307,7 +307,8 @@ BtreeLBAManager::_alloc_extent(
   extent_len_t len,
   pladdr_t addr,
   paddr_t actual_addr,
-  LogicalCachedExtent* nextent)
+  LogicalCachedExtent* nextent,
+  extent_ref_count_t refcount)
 {
   struct state_t {
     laddr_t last_end;
@@ -319,7 +320,7 @@ BtreeLBAManager::_alloc_extent(
   };
 
   LOG_PREFIX(BtreeLBAManager::_alloc_extent);
-  TRACET("{}~{}, hint={}", t, addr, len, hint);
+  TRACET("{}~{}, hint={}, refcount={}", t, addr, len, hint, refcount);
 
   ceph_assert(actual_addr != P_ADDR_NULL ? addr.is_laddr() : addr.is_paddr());
   auto c = get_context(t);
@@ -330,7 +331,7 @@ BtreeLBAManager::_alloc_extent(
     c,
     hint,
     [this, FNAME, c, hint, len, addr, lookup_attempts,
-    &t, nextent](auto &btree, auto &state) {
+    &t, nextent, refcount](auto &btree, auto &state) {
       return LBABtree::iterate_repeat(
        c,
        btree.upper_bound_right(c, hint),
@@ -366,12 +367,12 @@ BtreeLBAManager::_alloc_extent(
              interruptible::ready_future_marker{},
              seastar::stop_iteration::no);
          }
-       }).si_then([FNAME, c, addr, len, hint, &btree, &state, nextent] {
+       }).si_then([FNAME, c, addr, len, hint, &btree, &state, nextent, refcount] {
          return btree.insert(
            c,
            *state.insert_iter,
            state.last_end,
-           lba_map_val_t{len, pladdr_t(addr), 1, 0},
+           lba_map_val_t{len, pladdr_t(addr), refcount, 0},
            nextent
          ).si_then([&state, FNAME, c, addr, len, hint, nextent](auto &&p) {
            auto [iter, inserted] = std::move(p);
@@ -557,6 +558,8 @@ BtreeLBAManager::update_mapping(
       auto &result = res.map_value;
       DEBUGT("laddr={}, paddr {} => {} done -- {}",
              t, laddr, prev_addr, addr, result);
+      return update_mapping_iertr::make_ready_future<
+       extent_ref_count_t>(result.refcount);
     },
     update_mapping_iertr::pass_further{},
     /* ENOENT in particular should be impossible */
index bb0c52accfaa1721825083ab71937302a79f01ed..3ad6f9380c2c73c24ff00e9a0516477cee50438e 100644 (file)
@@ -221,7 +221,8 @@ public:
       len,
       P_ADDR_ZERO,
       P_ADDR_NULL,
-      nullptr);
+      nullptr,
+      EXTENT_DEFAULT_REF_COUNT);
   }
 
   alloc_extent_ret clone_mapping(
@@ -240,7 +241,8 @@ public:
       len,
       intermediate_key,
       actual_addr,
-      nullptr
+      nullptr,
+      EXTENT_DEFAULT_REF_COUNT
     ).si_then([&t, this, intermediate_base](auto indirect_mapping) {
       assert(indirect_mapping->is_indirect());
       return update_refcount(t, intermediate_base, 1, false
@@ -265,7 +267,8 @@ public:
     laddr_t hint,
     extent_len_t len,
     paddr_t addr,
-    LogicalCachedExtent &ext) final
+    LogicalCachedExtent &ext,
+    extent_ref_count_t refcount = EXTENT_DEFAULT_REF_COUNT) final
   {
     return _alloc_extent(
       t,
@@ -273,7 +276,8 @@ public:
       len,
       addr,
       P_ADDR_NULL,
-      &ext);
+      &ext,
+      refcount);
   }
 
   ref_ret decref_extent(
@@ -406,7 +410,8 @@ private:
     extent_len_t len,
     pladdr_t addr,
     paddr_t actual_addr,
-    LogicalCachedExtent*);
+    LogicalCachedExtent*,
+    extent_ref_count_t refcount);
 
   using _get_mapping_ret = get_mapping_iertr::future<BtreeLBAMappingRef>;
   _get_mapping_ret _get_mapping(
index 348c43e3c8257cff683ee3c6a86d4538836364d7..5869df8634096c5ffed8d9913388fda1dcc27519 100644 (file)
@@ -467,7 +467,7 @@ TransactionManager::rewrite_logical_extent(
       lextent->get_paddr(),
       nlextent->get_length(),
       nlextent->get_paddr(),
-      nlextent.get());
+      nlextent.get()).discard_result();
   } else {
     assert(get_extent_category(lextent->get_type()) == data_category_t::DATA);
     auto extents = cache->alloc_new_data_extents_by_type(
@@ -481,10 +481,11 @@ TransactionManager::rewrite_logical_extent(
       std::move(extents),
       0,
       lextent->get_length(),
-      [this, lextent, &t](auto &extents, auto &off, auto &left) {
+      extent_ref_count_t(0),
+      [this, lextent, &t](auto &extents, auto &off, auto &left, auto &refcount) {
       return trans_intr::do_for_each(
         extents,
-        [lextent, this, &t, &off, &left](auto &nextent) {
+        [lextent, this, &t, &off, &left, &refcount](auto &nextent) {
         LOG_PREFIX(TransactionManager::rewrite_logical_extent);
         bool first_extent = (off == 0);
         ceph_assert(left >= nextent->get_length());
@@ -510,14 +511,19 @@ TransactionManager::rewrite_logical_extent(
             lextent->get_paddr(),
             nlextent->get_length(),
             nlextent->get_paddr(),
-            nlextent.get());
+            nlextent.get()
+         ).si_then([&refcount](auto c) {
+           refcount = c;
+         });
         } else {
+         ceph_assert(refcount != 0);
           fut = lba_manager->alloc_extent(
             t,
             lextent->get_laddr() + off,
             nlextent->get_length(),
             nlextent->get_paddr(),
-            *nlextent
+            *nlextent,
+           refcount
           ).si_then([lextent, nlextent, off](auto mapping) {
             ceph_assert(mapping->get_key() == lextent->get_laddr() + off);
             ceph_assert(mapping->get_val() == nlextent->get_paddr());