From ed9c7734d69fb4bff2424624dfa56c7505da698b Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Mon, 14 Mar 2022 16:55:16 +0800 Subject: [PATCH] crimson/os/seastore/segment_cleaener: flush backrefs when trimming journal Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cache.cc | 1 + src/crimson/os/seastore/cache.h | 3 ++- src/crimson/os/seastore/segment_cleaner.cc | 19 +++++++++++++------ src/crimson/os/seastore/segment_cleaner.h | 3 +++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 22b83fe701e69..453d144175706 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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" diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index d862ac6bc5033..14eac64922138 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -16,12 +16,13 @@ #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, diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index 2b0a3577bd8ee..2f6ecf26b750c 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -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); + }); + }); }); }); } diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 7d219fd65908d..133b1d66e94b4 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -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() { -- 2.39.5