From f971289e5df958e5ce559f3d197bb30cb0e376f6 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Mon, 29 Nov 2021 10:17:05 +0800 Subject: [PATCH] crimson/os/seastore/journal: make JournalSubmitter aware of header merging Introduce an option seastore_journal_batch_preferred_fullness for JournalSubmitter to control the preferred fullness to trigger batch flushes. Signed-off-by: Yingxin Cheng --- src/common/options/crimson.yaml.in | 7 ++++++- src/crimson/os/seastore/journal.cc | 21 ++++++++++++++++----- src/crimson/os/seastore/journal.h | 2 ++ src/crimson/os/seastore/seastore_types.h | 6 ++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/common/options/crimson.yaml.in b/src/common/options/crimson.yaml.in index bf24679cdfc..d8072a94677 100644 --- a/src/common/options/crimson.yaml.in +++ b/src/common/options/crimson.yaml.in @@ -59,4 +59,9 @@ options: type: uint level: dev desc: The io depth limit to submit journal records - default: 2 + default: 5 +- name: seastore_journal_batch_preferred_fullness + type: float + level: dev + desc: The record fullness threshold to flush a journal batch + default: 0.95 diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 2fe3b339976..6f0a0559552 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -39,6 +39,8 @@ Journal::Journal( "seastore_journal_batch_capacity"), crimson::common::get_conf( "seastore_journal_batch_flush_size"), + crimson::common::get_conf( + "seastore_journal_batch_preferred_fullness"), journal_segment_manager), scanner(scanner) { @@ -556,15 +558,22 @@ Journal::RecordSubmitter::RecordSubmitter( std::size_t io_depth, std::size_t batch_capacity, std::size_t batch_flush_size, + double preferred_fullness, JournalSegmentManager& jsm) : io_depth_limit{io_depth}, + preferred_fullness{preferred_fullness}, journal_segment_manager{jsm}, batches(new RecordBatch[io_depth + 1]) { logger().info("Journal::RecordSubmitter: io_depth_limit={}, " - "batch_capacity={}, batch_flush_size={}", - io_depth, batch_capacity, batch_flush_size); - assert(io_depth > 0); + "batch_capacity={}, batch_flush_size={}, " + "preferred_fullness={}", + io_depth, batch_capacity, + batch_flush_size, preferred_fullness); + ceph_assert(io_depth > 0); + ceph_assert(batch_capacity > 0); + ceph_assert(preferred_fullness >= 0 && + preferred_fullness <= 1); free_batch_ptrs.reserve(io_depth + 1); for (std::size_t i = 0; i <= io_depth; ++i) { batches[i].initialize(i, batch_capacity, batch_flush_size); @@ -699,7 +708,7 @@ Journal::RecordSubmitter::submit_pending( // indirect write with or without the existing pending records auto write_fut = p_current_batch->add_pending( std::move(record), journal_segment_manager.get_block_size()); - if (flush) { + if (flush || state == state_t::IDLE) { flush_current_batch(); } return write_fut; @@ -745,7 +754,9 @@ Journal::RecordSubmitter::do_submit( return do_submit(std::move(record), handle); }); } else { - return submit_pending(std::move(record), handle, true); + bool flush = (maybe_new_size->get_fullness() > preferred_fullness ? + true : false); + return submit_pending(std::move(record), handle, flush); } } diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index 232455741ed..d6f18cceab2 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -359,6 +359,7 @@ private: RecordSubmitter(std::size_t io_depth, std::size_t batch_capacity, std::size_t batch_flush_size, + double preferred_fullness, JournalSegmentManager&); grouped_io_stats get_record_batch_stats() const { @@ -449,6 +450,7 @@ private: state_t state = state_t::IDLE; std::size_t num_outstanding_io = 0; std::size_t io_depth_limit; + double preferred_fullness; WritePipeline* write_pipeline = nullptr; JournalSegmentManager& journal_segment_manager; diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 6e009e9b361..b00bea37470 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -1323,6 +1323,12 @@ struct record_group_size_t { return tmp; } + double get_fullness() const { + assert(block_size > 0); + return ((double)(get_raw_mdlength() + dlength) / + get_encoded_length()); + } + void account(const record_size_t& rsize, extent_len_t block_size); }; -- 2.39.5