]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction_manager: prepare extents for lba_manager/backref_mana...
authorXuehan Xu <xxhdx1985126@gmail.com>
Sun, 27 Mar 2022 08:44:16 +0000 (16:44 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Sat, 7 May 2022 05:13:38 +0000 (13:13 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
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/test/crimson/seastore/test_btree_lba_manager.cc

index 122d0ada7af69ff08470f3caccfb36b398766a9d..244523d116388e7a8b58afa7ef7d42a2d40004a3 100644 (file)
@@ -110,7 +110,12 @@ public:
     laddr_t addr) = 0;
 
   virtual void complete_transaction(
-    Transaction &t) = 0;
+    Transaction &t,
+    std::vector<CachedExtentRef> &to_clear,    ///< extents whose pins are to be cleared,
+                                               //   as the results of their retirements
+    std::vector<CachedExtentRef> &to_link      ///< fresh extents whose pins are to be inserted
+                                               //   into backref manager's pin set
+  ) = 0;
 
   /**
    * Should be called after replay on each cached extent.
index d4bebf764f3b03c50655196700e812a60a4b997c..085a7613780d981543372fe0d6e085db10dbdd02 100644 (file)
@@ -252,16 +252,12 @@ static depth_t get_depth(const CachedExtent &e)
 }
 
 void BtreeLBAManager::complete_transaction(
-  Transaction &t)
+  Transaction &t,
+  std::vector<CachedExtentRef> &to_clear,
+  std::vector<CachedExtentRef> &to_link)
 {
   LOG_PREFIX(BtreeLBAManager::complete_transaction);
   DEBUGT("start", t);
-  std::vector<CachedExtentRef> to_clear;
-  to_clear.reserve(t.get_retired_set().size());
-  for (auto &e: t.get_retired_set()) {
-    if (e->is_logical() || is_lba_node(*e))
-      to_clear.push_back(e);
-  }
   // need to call check_parent from leaf->parent
   std::sort(
     to_clear.begin(), to_clear.end(),
@@ -273,14 +269,6 @@ void BtreeLBAManager::complete_transaction(
     pin_set.retire(pin);
   }
 
-  // ...but add_pin from parent->leaf
-  std::vector<CachedExtentRef> to_link;
-  to_link.reserve(t.get_fresh_block_stats().num);
-  t.for_each_fresh_block([&](auto &e) {
-    if (e->is_valid() && (is_lba_node(*e) || e->is_logical()))
-      to_link.push_back(e);
-  });
-
   std::sort(
     to_link.begin(), to_link.end(),
     [](auto &l, auto &r) -> bool { return get_depth(*l) > get_depth(*r); });
index 63b44d3080af49cddf434cc014398b3a1e29efd2..a109c9f1f179a4a07eb62af8b6dd5997785b9ba6 100644 (file)
@@ -99,7 +99,9 @@ public:
   }
 
   void complete_transaction(
-    Transaction &t) final;
+    Transaction &t,
+    std::vector<CachedExtentRef> &,
+    std::vector<CachedExtentRef> &) final;
 
   /**
    * init_cached_extent
index aec0b57a9d45d498ce0d7709a5ab60e76182a815..7251b07fac9ad08862efbf28e66c94f0d92ad64b 100644 (file)
@@ -375,7 +375,35 @@ TransactionManager::submit_transaction_direct(
           submit_result.record_block_base,
           start_seq,
           segment_cleaner.get());
-      lba_manager->complete_transaction(tref);
+
+      std::vector<CachedExtentRef> lba_to_clear;
+      std::vector<CachedExtentRef> backref_to_clear;
+      lba_to_clear.reserve(tref.get_retired_set().size());
+      backref_to_clear.reserve(tref.get_retired_set().size());
+      for (auto &e: tref.get_retired_set()) {
+       if (e->is_logical() || is_lba_node(e->get_type()))
+         lba_to_clear.push_back(e);
+       else if (is_backref_node(e->get_type()))
+         backref_to_clear.push_back(e);
+      }
+
+      // ...but add_pin from parent->leaf
+      std::vector<CachedExtentRef> lba_to_link;
+      std::vector<CachedExtentRef> backref_to_link;
+      lba_to_link.reserve(tref.get_fresh_block_stats().num);
+      backref_to_link.reserve(tref.get_fresh_block_stats().num);
+      tref.for_each_fresh_block([&](auto &e) {
+       if (e->is_valid()) {
+         if (is_lba_node(e->get_type()) || e->is_logical())
+           lba_to_link.push_back(e);
+         else if (is_backref_node(e->get_type()))
+           backref_to_link.push_back(e);
+       }
+      });
+
+      lba_manager->complete_transaction(tref, lba_to_clear, lba_to_link);
+      backref_manager->complete_transaction(tref, backref_to_clear, backref_to_link);
+
       segment_cleaner->update_journal_tail_target(
        cache->get_oldest_dirty_from().value_or(start_seq));
       return segment_cleaner->maybe_release_segment(tref);
index 351536bd904d59a5ce6a391eb8f3e163a44b28bf..8e21f0affe85958d52fa0037d8488dbb1c822b15 100644 (file)
@@ -315,7 +315,21 @@ struct btree_lba_manager_test : btree_test_base {
   btree_lba_manager_test() = default;
 
   void complete_commit(Transaction &t) final {
-    lba_manager->complete_transaction(t);
+    std::vector<CachedExtentRef> lba_to_clear;
+    lba_to_clear.reserve(t.get_retired_set().size());
+    for (auto &e: t.get_retired_set()) {
+      if (e->is_logical() || is_lba_node(e->get_type()))
+       lba_to_clear.push_back(e);
+    }
+    std::vector<CachedExtentRef> lba_to_link;
+    lba_to_link.reserve(t.get_fresh_block_stats().num);
+    t.for_each_fresh_block([&](auto &e) {
+      if (e->is_valid() &&
+         (is_lba_node(e->get_type()) || e->is_logical()))
+         lba_to_link.push_back(e);
+    });
+
+    lba_manager->complete_transaction(t, lba_to_clear, lba_to_link);
   }
 
   LBAManager::mkfs_ret test_structure_setup(Transaction &t) final {