]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/segment_cleaener: flush backrefs when trimming journal
authorXuehan Xu <xxhdx1985126@gmail.com>
Mon, 14 Mar 2022 08:55:16 +0000 (16:55 +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.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/segment_cleaner.cc
src/crimson/os/seastore/segment_cleaner.h

index 22b83fe701e69864f092437895264c95b00a8fa8..453d144175706fe1bd1962a861e9a14cb13a33bc 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "crimson/os/seastore/logging.h"
 #include "crimson/common/config_proxy.h"
+#include "crimson/os/seastore/segment_cleaner.h"
 
 // included for get_extent_by_type
 #include "crimson/os/seastore/collection_manager/collection_flat_node.h"
index d862ac6bc503354b16fa7b8c0f68aa10940889dc..14eac64922138976a2091809dc0b44f6a7ebdecd 100644 (file)
 #include "crimson/os/seastore/random_block_manager.h"
 #include "crimson/os/seastore/root_block.h"
 #include "crimson/os/seastore/seastore_types.h"
-#include "crimson/os/seastore/segment_cleaner.h"
 #include "crimson/os/seastore/segment_manager.h"
 #include "crimson/os/seastore/transaction.h"
 
 namespace crimson::os::seastore {
 
+class SegmentCleaner;
+
 struct backref_buf_entry_t {
   backref_buf_entry_t(
     const paddr_t paddr,
index 2b0a3577bd8ee9a44658a8a770ff0fd19cb1986b..2f6ecf26b750c0aa719ebb82319a0d2d1093c26e 100644 (file)
@@ -376,10 +376,12 @@ void SpaceTrackerSimple::dump_usage(segment_id_t id) const
 SegmentCleaner::SegmentCleaner(
   config_t config,
   SegmentManagerGroupRef&& sm_group,
+  BackrefManager &backref_manager,
   bool detailed)
   : detailed(detailed),
     config(config),
     sm_group(std::move(sm_group)),
+    backref_manager(backref_manager),
     ool_segment_seq_allocator(
       new SegmentSeqAllocator(segment_type_t::OOL)),
     gc_process(*this)
@@ -539,12 +541,17 @@ SegmentCleaner::rewrite_dirty_ret SegmentCleaner::rewrite_dirty(
     return seastar::do_with(
       std::move(dirty_list),
       [FNAME, this, &t](auto &dirty_list) {
-       return trans_intr::do_for_each(
-         dirty_list,
-         [FNAME, this, &t](auto &e) {
-           DEBUGT("cleaning {}", t, *e);
-           return ecb->rewrite_extent(t, e);
-         });
+       return backref_manager.batch_insert_from_cache(
+         t,
+         dirty_list.back()->get_dirty_from()
+       ).si_then([FNAME, this, &t, &dirty_list] {
+         return trans_intr::do_for_each(
+           dirty_list,
+           [FNAME, this, &t](auto &e) {
+             DEBUGT("cleaning {}", t, *e);
+             return ecb->rewrite_extent(t, e);
+           });
+       });
       });
   });
 }
index 7d219fd65908d4ef6da3fc02281ab26950ca33a4..133b1d66e94b465b85652cffd1e53b421d192060 100644 (file)
@@ -11,6 +11,7 @@
 #include "osd/osd_types.h"
 
 #include "crimson/common/log.h"
+#include "crimson/os/seastore/backref_manager.h"
 #include "crimson/os/seastore/cached_extent.h"
 #include "crimson/os/seastore/seastore_types.h"
 #include "crimson/os/seastore/segment_manager.h"
@@ -549,6 +550,7 @@ private:
   const config_t config;
 
   SegmentManagerGroupRef sm_group;
+  BackrefManager &backref_manager;
 
   SpaceTrackerIRef space_tracker;
   segments_info_t segments;
@@ -593,6 +595,7 @@ public:
   SegmentCleaner(
     config_t config,
     SegmentManagerGroupRef&& sm_group,
+    BackrefManager &backref_manager,
     bool detailed = false);
 
   SegmentSeqAllocator& get_ool_segment_seq_allocator() {