From: Xuehan Xu Date: Mon, 14 Mar 2022 08:55:16 +0000 (+0800) Subject: crimson/os/seastore/segment_cleaener: flush backrefs when trimming journal X-Git-Tag: v18.0.0~915^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ed9c7734d69fb4bff2424624dfa56c7505da698b;p=ceph.git crimson/os/seastore/segment_cleaener: flush backrefs when trimming journal Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 22b83fe701e6..453d14417570 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 d862ac6bc503..14eac6492213 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 2b0a3577bd8e..2f6ecf26b750 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 7d219fd65908..133b1d66e94b 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() {