]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/lba_manager: decrease refcount of the physical lba
authorXuehan Xu <xxhdx1985126@gmail.com>
Wed, 17 May 2023 03:35:20 +0000 (03:35 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 19 Oct 2023 07:13:17 +0000 (07:13 +0000)
mappings when removing indirect lba mappings

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
(cherry picked from commit 31204c2e1cb05ac1476abbcc5d5198f38e326095)

src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h

index 99d140ff53f14ebcb12832eca9194bae182b88c0..0940cc1a05b6b876e06eeb5060b6a7d95ea63e8d 100644 (file)
@@ -1195,7 +1195,7 @@ public:
     laddr = nladdr;
   }
 
-  void maybe_set_intermediate_laddr(LBAMappingmapping) {
+  void maybe_set_intermediate_laddr(LBAMapping &mapping) {
     laddr = mapping.is_indirect()
       ? mapping.get_intermediate_key()
       : mapping.get_key();
index 9a4809d6a99270b2b91246acbbb6d9cc315458fc..4a4b5e40690206353f5cd775abfdc3896f58c9a1 100644 (file)
@@ -616,6 +616,56 @@ void BtreeLBAManager::register_metrics()
   );
 }
 
+BtreeLBAManager::ref_iertr::future<std::optional<std::pair<paddr_t, extent_len_t>>>
+BtreeLBAManager::_decref_intermediate(
+  Transaction &t,
+  laddr_t addr,
+  extent_len_t len)
+{
+  auto c = get_context(t);
+  return with_btree<LBABtree>(
+    cache,
+    c,
+    [c, addr, len](auto &btree) mutable {
+    return btree.upper_bound_right(
+      c, addr
+    ).si_then([&btree, addr, len, c](auto iter) {
+      return seastar::do_with(
+       std::move(iter),
+       [&btree, addr, len, c](auto &iter) {
+       ceph_assert(!iter.is_end());
+       ceph_assert(iter.get_key() <= addr);
+       auto val = iter.get_val();
+       ceph_assert(iter.get_key() + val.len >= addr + len);
+       ceph_assert(val.pladdr.is_paddr());
+       ceph_assert(val.refcount >= 1);
+       val.refcount -= 1;
+
+       LOG_PREFIX(BtreeLBAManager::_decref_intermediate);
+       TRACET("decreased refcount of intermediate key {} -- {}",
+         c.trans,
+         iter.get_key(),
+         val);
+
+       if (!val.refcount) {
+         return btree.remove(c, iter
+         ).si_then([val] {
+           return std::make_optional<
+             std::pair<paddr_t, extent_len_t>>(
+               val.pladdr.get_paddr(), val.len);
+         });
+       } else {
+         return btree.update(c, iter, val, nullptr
+         ).si_then([](auto) {
+           return seastar::make_ready_future<
+             std::optional<std::pair<paddr_t, extent_len_t>>>(std::nullopt);
+         });
+       }
+      });
+    });
+  });
+}
+
 BtreeLBAManager::update_refcount_ret
 BtreeLBAManager::update_refcount(
   Transaction &t,
@@ -634,13 +684,32 @@ BtreeLBAManager::update_refcount(
       return out;
     },
     nullptr
-  ).si_then([&t, addr, delta, FNAME](auto result) {
+  ).si_then([&t, addr, delta, FNAME, this](auto result) {
     DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, result);
-    return ref_update_result_t{
-      result.refcount,
-      result.pladdr,
-      result.len
-     };
+    auto fut = ref_iertr::make_ready_future<
+      std::optional<std::pair<paddr_t, extent_len_t>>>();
+    if (!result.refcount && result.pladdr.is_laddr()) {
+      fut = _decref_intermediate(
+       t,
+       result.pladdr.get_laddr(),
+       result.len
+      );
+    }
+    return fut.si_then([result](auto removed) {
+      if (result.pladdr.is_laddr()
+         && removed) {
+       return ref_update_result_t{
+         result.refcount,
+         removed->first,
+         removed->second};
+      } else {
+       return ref_update_result_t{
+         result.refcount,
+         result.pladdr,
+         result.len
+       };
+      }
+    });
   });
 }
 
index b37709ee6b159432da445abde810ccdc92185c08..403bcd05d39912f5bc4161506ffd494eec3be396 100644 (file)
@@ -375,6 +375,11 @@ private:
     op_context_t<laddr_t> c,
     std::list<BtreeLBAMappingRef> &pin_list);
 
+  ref_iertr::future<std::optional<std::pair<paddr_t, extent_len_t>>>
+  _decref_intermediate(
+    Transaction &t,
+    laddr_t addr,
+    extent_len_t len);
 };
 using BtreeLBAManagerRef = std::unique_ptr<BtreeLBAManager>;