]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: make JournalSubmitter aware of header merging 44127/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Mon, 29 Nov 2021 02:17:05 +0000 (10:17 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 9 Dec 2021 03:28:49 +0000 (11:28 +0800)
Introduce an option seastore_journal_batch_preferred_fullness for
JournalSubmitter to control the preferred fullness to trigger batch
flushes.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/common/options/crimson.yaml.in
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h
src/crimson/os/seastore/seastore_types.h

index bf24679cdfca21f73135c1f96f476a306bec36c9..d8072a94677c97c29539de9152ab8031dd08411a 100644 (file)
@@ -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
index 2fe3b33997667c70e72f9d1f6c00e4102253ad87..6f0a05595521bfee8ca056ecdfd23d79b69d7452 100644 (file)
@@ -39,6 +39,8 @@ Journal::Journal(
                        "seastore_journal_batch_capacity"),
                      crimson::common::get_conf<Option::size_t>(
                        "seastore_journal_batch_flush_size"),
+                     crimson::common::get_conf<double>(
+                       "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);
     }
   }
 
index 232455741ed165014f541a2844dc59517f232d46..d6f18cceab296eb8754004e4eb4de95fa6447ad6 100644 (file)
@@ -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;
index 6e009e9b361c833921ec2945225e52cddd8586fc..b00bea374701f50c16b7dc4fb4ea9391f4efbac9 100644 (file)
@@ -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);
 };