]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction_manager: don't remove intermediate
authorXuehan Xu <xuxuehan@qianxin.com>
Tue, 11 Jul 2023 10:30:03 +0000 (18:30 +0800)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 19 Oct 2023 07:13:17 +0000 (07:13 +0000)
mapping when remapping pins

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
(cherry picked from commit 4b14549e6ebd6aa63e9006d3c487e139731817fc)

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
src/crimson/os/seastore/transaction_manager.h
src/test/crimson/seastore/test_btree_lba_manager.cc

index 85ca6a5eb82d79bf3d04c0a4b29baab77a5dcb38..d7adf2304fbb69ba27eff162d6f837597d1e7ac6 100644 (file)
@@ -118,7 +118,8 @@ public:
    */
   virtual ref_ret decref_extent(
     Transaction &t,
-    laddr_t addr) = 0;
+    laddr_t addr,
+    bool cascade_remove) = 0;
 
   /**
    * Increments ref count on extent
index 4a4b5e40690206353f5cd775abfdc3896f58c9a1..a607cd612a59abe5fa4e6a880c14f318c68ec804 100644 (file)
@@ -670,7 +670,8 @@ BtreeLBAManager::update_refcount_ret
 BtreeLBAManager::update_refcount(
   Transaction &t,
   laddr_t addr,
-  int delta)
+  int delta,
+  bool cascade_remove)
 {
   LOG_PREFIX(BtreeLBAManager::update_refcount);
   TRACET("laddr={}, delta={}", t, addr, delta);
@@ -684,11 +685,11 @@ BtreeLBAManager::update_refcount(
       return out;
     },
     nullptr
-  ).si_then([&t, addr, delta, FNAME, this](auto result) {
+  ).si_then([&t, addr, delta, FNAME, this, cascade_remove](auto result) {
     DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, result);
     auto fut = ref_iertr::make_ready_future<
       std::optional<std::pair<paddr_t, extent_len_t>>>();
-    if (!result.refcount && result.pladdr.is_laddr()) {
+    if (!result.refcount && result.pladdr.is_laddr() && cascade_remove) {
       fut = _decref_intermediate(
        t,
        result.pladdr.get_laddr(),
index c14cb2682d9dd042bd9520c324843305db5e4749..892600ed0e94c070affe9879abd3ede2f80585a5 100644 (file)
@@ -266,14 +266,15 @@ public:
 
   ref_ret decref_extent(
     Transaction &t,
-    laddr_t addr) final {
-    return update_refcount(t, addr, -1);
+    laddr_t addr,
+    bool cascade_remove) final {
+    return update_refcount(t, addr, -1, cascade_remove);
   }
 
   ref_ret incref_extent(
     Transaction &t,
     laddr_t addr) final {
-    return update_refcount(t, addr, 1);
+    return update_refcount(t, addr, 1, false);
   }
 
   ref_ret incref_extent(
@@ -346,7 +347,8 @@ private:
   update_refcount_ret update_refcount(
     Transaction &t,
     laddr_t addr,
-    int delta);
+    int delta,
+    bool cascade_remove);
 
   /**
    * _update_mapping
index a829358b1fed41c48b3ca7747a5ab59633dbbb05..ad8e5f1a65f450b6e567f95ffefe3df07a436a6a 100644 (file)
@@ -216,7 +216,7 @@ TransactionManager::ref_ret TransactionManager::dec_ref(
 {
   LOG_PREFIX(TransactionManager::dec_ref);
   TRACET("{}", t, *ref);
-  return lba_manager->decref_extent(t, ref->get_laddr()
+  return lba_manager->decref_extent(t, ref->get_laddr(), true
   ).si_then([this, FNAME, &t, ref](auto result) {
     DEBUGT("extent refcount is decremented to {} -- {}",
            t, result.refcount, *ref);
@@ -227,13 +227,14 @@ TransactionManager::ref_ret TransactionManager::dec_ref(
   });
 }
 
-TransactionManager::ref_ret TransactionManager::dec_ref(
+TransactionManager::ref_ret TransactionManager::_dec_ref(
   Transaction &t,
-  laddr_t offset)
+  laddr_t offset,
+  bool cascade_remove)
 {
-  LOG_PREFIX(TransactionManager::dec_ref);
+  LOG_PREFIX(TransactionManager::_dec_ref);
   TRACET("{}", t, offset);
-  return lba_manager->decref_extent(t, offset
+  return lba_manager->decref_extent(t, offset, cascade_remove
   ).si_then([this, FNAME, offset, &t](auto result) -> ref_ret {
     DEBUGT("extent refcount is decremented to {} -- {}~{}, {}",
            t, result.refcount, offset, result.length, result.addr);
index 51d66e2f3818f888307c2d15d8834a3bd88e5b7d..afc7a648886dc7caed7f085bb59f89302ca28a47 100644 (file)
@@ -253,7 +253,9 @@ public:
   /// Remove refcount for offset
   ref_ret dec_ref(
     Transaction &t,
-    laddr_t offset);
+    laddr_t offset) {
+    return _dec_ref(t, offset, true);
+  }
 
   /// remove refcount for list of offset
   using refs_ret = ref_iertr::future<std::vector<unsigned>>;
@@ -384,7 +386,7 @@ public:
         [this, &t, original_laddr, original_paddr,
        original_len, intermediate_base, intermediate_key]
         (auto &ret, auto &count, auto &original_bptr, auto &remaps) {
-        return dec_ref(t, original_laddr
+        return _dec_ref(t, original_laddr, false
         ).si_then([this, &t, &original_bptr, &ret, &count,
                   &remaps, intermediate_base, intermediate_key,
                    original_laddr, original_paddr, original_len](auto) {
@@ -732,6 +734,12 @@ private:
     ExtentPlacementManager::dispatch_result_t dispatch_result,
     std::optional<journal_seq_t> seq_to_trim = std::nullopt);
 
+  /// Remove refcount for offset
+  ref_ret _dec_ref(
+    Transaction &t,
+    laddr_t offset,
+    bool cascade_remove);
+
   /**
    * pin_to_extent
    *
index 082de1199567936503405b612844e890f9f5c209..f18c3ac670ad66b596bfdaf0056b1e89f6bf9467 100644 (file)
@@ -468,7 +468,8 @@ struct btree_lba_manager_test : btree_test_base {
       [=, this](auto &t) {
        return lba_manager->decref_extent(
          t,
-         target->first
+         target->first,
+         true
        ).si_then([this, &t, target](auto result) {
          EXPECT_EQ(result.refcount, target->second.refcount);
          if (result.refcount == 0) {