]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/transaction_manager: scan backref tree on mount
authorXuehan Xu <xxhdx1985126@gmail.com>
Tue, 15 Mar 2022 03:40:52 +0000 (11:40 +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/cache.h
src/crimson/os/seastore/segment_cleaner.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/test/crimson/seastore/test_transaction_manager.cc
src/test/crimson/seastore/transaction_manager_test_state.h

index 0748ab5cf71360f34f37d3d2eb14ca988f92978a..aa30c061d64daaff4a6ce59f54a47747ac45ef02 100644 (file)
@@ -916,6 +916,9 @@ public:
   /// Dump live extents
   void dump_contents();
 
+  void force_roll_backref_buffer() {
+    may_roll_backref_buffer(P_ADDR_NULL, true);
+  }
   void may_roll_backref_buffer(
     const paddr_t &final_block_start,
     bool force_roll = false) {
index 133b1d66e94b465b85652cffd1e53b421d192060..b189af533b2ad9ad47890d4ad092d0b3888af637 100644 (file)
@@ -690,8 +690,9 @@ public:
 
   void mark_space_free(
     paddr_t addr,
-    extent_len_t len) {
-    if (!init_complete)
+    extent_len_t len,
+    const bool force = false) {
+    if (!init_complete && !force)
       return;
 
     ceph_assert(stats.used_bytes >= len);
index 6977c716d507b3c2549882939b319e07415484f9..1588d0a96a7cd8540594522c1574f5212cf57e05 100644 (file)
@@ -111,11 +111,14 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
          *tref,
          [this, FNAME](auto &t) {
            return cache->init_cached_extents(t, [this](auto &t, auto &e) {
-             return lba_manager->init_cached_extent(t, e);
+             if (is_backref_node(e->get_type()))
+               return backref_manager->init_cached_extent(t, e);
+             else
+               return lba_manager->init_cached_extent(t, e);
            }).si_then([this, FNAME, &t] {
              assert(segment_cleaner->debug_check_space(
                       *segment_cleaner->get_empty_space_tracker()));
-             return lba_manager->scan_mapped_space(
+             return backref_manager->scan_mapped_space(
                t,
                [this, FNAME, &t](paddr_t addr, extent_len_t len, depth_t depth) {
                  TRACET(
@@ -131,11 +134,42 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
                      seastar::lowres_system_clock::time_point(),
                      /* init_scan = */ true);
                  }
+                 if (depth) {
+                   if (depth > 1) {
+                     cache->add_backref_extent(
+                       addr, extent_types_t::BACKREF_INTERNAL);
+                   } else {
+                     cache->add_backref_extent(
+                       addr, extent_types_t::BACKREF_LEAF);
+                   }
+                 }
+               }).si_then([this] {
+                 LOG_PREFIX(TransactionManager::mount);
+                 auto &backrefs = cache->get_backrefs();
+                 DEBUG("marking {} backrefs used", backrefs.size());
+                 for (auto &backref : backrefs) {
+                   segment_cleaner->mark_space_used(
+                     backref.paddr,
+                     backref.len,
+                     seastar::lowres_system_clock::time_point(),
+                     seastar::lowres_system_clock::time_point(),
+                     true);
+                 }
+                 auto &del_backrefs = cache->get_del_backrefs();
+                 DEBUG("marking {} backrefs free", del_backrefs.size());
+                 for (auto &del_backref : del_backrefs) {
+                   segment_cleaner->mark_space_free(
+                     del_backref.paddr,
+                     del_backref.len,
+                     true);
+                 }
+                 return seastar::now();
                });
            });
          });
       });
   }).safe_then([this] {
+    cache->force_roll_backref_buffer();
     return epm->open();
   }).safe_then([FNAME, this] {
     segment_cleaner->complete_init();
index fd7c743e26f1bd490b3fc53d1c6101f73b3bbaf5..b4e9ed92af47c7abf72d5ced5ed9309584863067 100644 (file)
@@ -574,6 +574,14 @@ public:
   auto get_lba_manager() {
     return lba_manager.get();
   }
+
+  auto get_backref_manager() {
+    return backref_manager.get();
+  }
+
+  auto get_cache() {
+    return cache.get();
+  }
 };
 using TransactionManagerRef = std::unique_ptr<TransactionManager>;
 
index ad3de7dc39753390d9d199f5e750b1bd770f131c..cfdfef9a6d2f3325d5e69fe490c701f0d633fbbe 100644 (file)
@@ -388,13 +388,35 @@ struct transaction_manager_test_t :
     with_trans_intr(
       *t.t,
       [this, &tracker](auto &t) {
-       return lba_manager->scan_mapped_space(
+       return backref_manager->scan_mapped_space(
          t,
          [&tracker](auto offset, auto len, depth_t) {
+           logger().debug("check_usage: tracker alloc {}~{}",
+             offset, len);
            tracker->allocate(
              offset.as_seg_paddr().get_segment_id(),
              offset.as_seg_paddr().get_segment_off(),
              len);
+         }).si_then([&tracker, this] {
+           auto &backrefs = cache->get_backrefs();
+           for (auto &backref : backrefs) {
+             logger().debug("check_usage: by backref, tracker alloc {}~{}",
+               backref.paddr, backref.len);
+             tracker->allocate(
+               backref.paddr.as_seg_paddr().get_segment_id(),
+               backref.paddr.as_seg_paddr().get_segment_off(),
+               backref.len);
+           }
+           auto &del_backrefs = cache->get_del_backrefs();
+           for (auto &del_backref : del_backrefs) {
+             logger().debug("check_usage: by backref, tracker release {}~{}",
+               del_backref.paddr, del_backref.len);
+             tracker->release(
+               del_backref.paddr.as_seg_paddr().get_segment_id(),
+               del_backref.paddr.as_seg_paddr().get_segment_off(),
+               del_backref.len);
+           }
+           return seastar::now();
          });
       }).unsafe_get0();
     return segment_cleaner->debug_check_space(*tracker);
index 93fc5af92eb70eddb074f3418e29a5500f22a6d1..92cf2115ac4fc7d023716ab941032fb407654a08 100644 (file)
@@ -130,6 +130,8 @@ class TMTestState : public EphemeralTestState {
 protected:
   TransactionManagerRef tm;
   LBAManager *lba_manager;
+  BackrefManager *backref_manager;
+  Cache* cache;
   SegmentCleaner *segment_cleaner;
 
   TMTestState() : EphemeralTestState(1) {}
@@ -146,6 +148,8 @@ protected:
     }
     segment_cleaner = tm->get_segment_cleaner();
     lba_manager = tm->get_lba_manager();
+    backref_manager = tm->get_backref_manager();
+    cache = tm->get_cache();
   }
 
   virtual void _destroy() override {