From 47d8167cc4f6e26d36c75de2bff250e41562f53b Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 24 Mar 2021 18:53:13 +0000 Subject: [PATCH] crimson/os/seastore/segment_cleaner: introduce byte limit on rewrite_dirty Signed-off-by: Samuel Just --- src/crimson/os/seastore/cache.cc | 9 +++++++-- src/crimson/os/seastore/cache.h | 3 ++- src/crimson/os/seastore/segment_cleaner.cc | 3 ++- src/crimson/os/seastore/segment_cleaner.h | 12 +++++++++--- src/crimson/os/seastore/transaction_manager.cc | 6 ++++-- src/crimson/os/seastore/transaction_manager.h | 3 ++- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index c48ab73df8c..81924972eb9 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -447,10 +447,14 @@ Cache::replay_delta( } Cache::get_next_dirty_extents_ret Cache::get_next_dirty_extents( - journal_seq_t seq) + journal_seq_t seq, + size_t max_bytes) { std::vector ret; - for (auto i = dirty.begin(); i != dirty.end(); ++i) { + size_t bytes_so_far = 0; + for (auto i = dirty.begin(); + i != dirty.end() && bytes_so_far < max_bytes; + ++i) { CachedExtentRef cand; if (i->dirty_from != journal_seq_t() && i->dirty_from < seq) { logger().debug( @@ -463,6 +467,7 @@ Cache::get_next_dirty_extents_ret Cache::get_next_dirty_extents( *i); } assert(ret.empty() || ret.back()->dirty_from <= i->dirty_from); + bytes_so_far += i->get_length(); ret.push_back(&*i); } else { break; diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 5f248c69448..3125cc1e2e0 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -482,7 +482,8 @@ public: using get_next_dirty_extents_ret = get_next_dirty_extents_ertr::future< std::vector>; get_next_dirty_extents_ret get_next_dirty_extents( - journal_seq_t seq); + journal_seq_t seq, + size_t max_bytes); /// returns std::nullopt if no dirty extents or dirty_from for oldest std::optional get_oldest_dirty_from() const { diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index fe8954a0bf7..6dc2a78472d 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -204,7 +204,8 @@ SegmentCleaner::rewrite_dirty_ret SegmentCleaner::rewrite_dirty( journal_seq_t limit) { return ecb->get_next_dirty_extents( - limit + limit, + config.journal_rewrite_per_cycle ).then([=, &t](auto dirty_list) { return seastar::do_with( std::move(dirty_list), diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 5fd7fb080ab..93acb8fa67a 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -223,7 +223,11 @@ public: double available_ratio_hard_limit = 0; - size_t reclaim_bytes_stride = 0; // Number of bytes to reclaim on each cycle + /// Number of bytes to reclaim on each cycle + size_t reclaim_bytes_stride = 0; + + /// Number of bytes of journal entries to rewrite per cycle + size_t journal_rewrite_per_cycle = 0; static config_t default_from_segment_manager( SegmentManager &manager) { @@ -237,7 +241,8 @@ public: .6, // reclaim_ratio_hard_limit .3, // reclaim_ratio_gc_threshhold .1, // available_ratio_hard_limit - 1<<20 // reclaim 1MB per gc cycle + 1<<20,// reclaim 1MB per gc cycle + 1<<20 // rewrite 1MB of journal entries per gc cycle }; } }; @@ -255,7 +260,8 @@ public: using get_next_dirty_extents_ret = get_next_dirty_extents_ertr::future< std::vector>; virtual get_next_dirty_extents_ret get_next_dirty_extents( - journal_seq_t bound ///< [in] return extents with dirty_from < bound + journal_seq_t bound,///< [in] return extents with dirty_from < bound + size_t max_bytes ///< [in] return up to max_bytes of extents ) = 0; using extent_mapping_ertr = crimson::errorator< diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index b0faea77583..a20ffc1ed2e 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -251,9 +251,11 @@ TransactionManager::submit_transaction_direct( } TransactionManager::get_next_dirty_extents_ret -TransactionManager::get_next_dirty_extents(journal_seq_t seq) +TransactionManager::get_next_dirty_extents( + journal_seq_t seq, + size_t max_bytes) { - return cache->get_next_dirty_extents(seq); + return cache->get_next_dirty_extents(seq, max_bytes); } TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent( diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 9b38a185353..93a24c8109f 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -287,7 +287,8 @@ public: using SegmentCleaner::ExtentCallbackInterface::get_next_dirty_extents_ret; get_next_dirty_extents_ret get_next_dirty_extents( - journal_seq_t seq) final; + journal_seq_t seq, + size_t max_bytes) final; using SegmentCleaner::ExtentCallbackInterface::rewrite_extent_ret; rewrite_extent_ret rewrite_extent( -- 2.39.5