]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/segment_cleaner: introduce byte limit on rewrite_dirty
authorSamuel Just <sjust@redhat.com>
Wed, 24 Mar 2021 18:53:13 +0000 (18:53 +0000)
committerSamuel Just <sjust@redhat.com>
Wed, 24 Mar 2021 18:53:13 +0000 (18:53 +0000)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/segment_cleaner.cc
src/crimson/os/seastore/segment_cleaner.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index c48ab73df8cd25ce941166171dca72182a7f51fa..81924972eb9368c5c77c02cc95d229a0c88d6efb 100644 (file)
@@ -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<CachedExtentRef> 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;
index 5f248c69448cfa6c206b0316672e0b88850a0d8d..3125cc1e2e04d1f6e44959387e75d5a538af7ace 100644 (file)
@@ -482,7 +482,8 @@ public:
   using get_next_dirty_extents_ret = get_next_dirty_extents_ertr::future<
     std::vector<CachedExtentRef>>;
   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<journal_seq_t> get_oldest_dirty_from() const {
index fe8954a0bf759b3c68e1f9a764dbadcb2583c020..6dc2a78472d7e6f6573840042ca1b02bd563c376 100644 (file)
@@ -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),
index 5fd7fb080abd7b3496bbdf9d73527cd874066efc..93acb8fa67a38751a433293705206a875633b5f0 100644 (file)
@@ -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<CachedExtentRef>>;
     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<
index b0faea77583dc3aa302784186a59e47635169433..a20ffc1ed2e6c03fa84dd39dbfe3ebcd972ce6bb 100644 (file)
@@ -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(
index 9b38a185353eb470118fa132cb970f39fba263e6..93a24c8109f5760dc83f92b927c405328efa2079 100644 (file)
@@ -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(