]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/async_cleaner: re-introduce journal_header member 47183/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 20 Jul 2022 04:14:46 +0000 (12:14 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 20 Jul 2022 04:14:46 +0000 (12:14 +0800)
RBM won't have segments_info_t, it has to maintain the journal_header by
itself.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/async_cleaner.cc
src/crimson/os/seastore/async_cleaner.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_seastore_journal.cc

index e0d198be78fc150ed5f755906bc25a9df9662306..3f9e00c4d4e9678dfb52461b89fd21e5ac6632e0 100644 (file)
@@ -603,6 +603,11 @@ segment_id_t AsyncCleaner::allocate_segment(
     if (segment_info.is_empty()) {
       auto old_usage = calc_utilization(seg_id);
       segments.mark_open(seg_id, seq, type, category, generation);
+      if (type == segment_type_t::JOURNAL) {
+        set_journal_head(segments.get_journal_head());
+      } else {
+        gc_process.maybe_wake_on_space_used();
+      }
       auto new_usage = calc_utilization(seg_id);
       adjust_segment_util(old_usage, new_usage);
       INFO("opened, should_block_on_trim {}, should_block_on_reclaim {}, "
@@ -639,7 +644,6 @@ void AsyncCleaner::update_journal_tail_target(
 
   journal_seq_t target = std::min(dirty_replay_from, alloc_replay_from);
   ceph_assert(target != JOURNAL_SEQ_NULL);
-  auto journal_head = segments.get_journal_head();
   ceph_assert(journal_head == JOURNAL_SEQ_NULL ||
               journal_head >= target);
   if (journal_tail_target == JOURNAL_SEQ_NULL ||
@@ -675,7 +679,6 @@ void AsyncCleaner::update_journal_tail_committed(journal_seq_t committed)
   if (committed == JOURNAL_SEQ_NULL) {
     return;
   }
-  auto journal_head = segments.get_journal_head();
   ceph_assert(journal_head == JOURNAL_SEQ_NULL ||
               journal_head >= committed);
 
@@ -1328,7 +1331,7 @@ void AsyncCleaner::complete_init()
   }
   INFO("done, start GC, time_bound={}",
        sea_time_point_printer_t{segments.get_time_bound()});
-  ceph_assert(segments.get_journal_head() != JOURNAL_SEQ_NULL);
+  ceph_assert(journal_head != JOURNAL_SEQ_NULL);
   init_complete = true;
   gc_process.start();
 }
@@ -1485,7 +1488,7 @@ void AsyncCleaner::log_gc_state(const char *caller) const
       should_block_on_trim(),
       should_block_on_reclaim(),
       gc_should_reclaim_space(),
-      segments.get_journal_head(),
+      journal_head,
       journal_tail_target,
       journal_tail_committed,
       get_dirty_tail(),
index 94791486ff9ef9dcfee0926e6e8a52ebd7b157f0..4e3f43f248ba83cb794ece9aaf13baa3d56df811 100644 (file)
@@ -269,6 +269,8 @@ private:
  */
 class SegmentProvider {
 public:
+  virtual void set_journal_head(journal_seq_t) = 0;
+
   virtual journal_seq_t get_journal_tail_target() const = 0;
 
   virtual const segment_info_t& get_seg_info(segment_id_t id) const = 0;
@@ -732,6 +734,9 @@ private:
   /// most recently committed journal_tail
   journal_seq_t journal_tail_committed;
 
+  /// head of journal
+  journal_seq_t journal_head;
+
   ExtentCallbackInterface *ecb = nullptr;
 
   /// populated if there is an IO blocked on hard limits
@@ -774,6 +779,14 @@ public:
     return segments[id];
   }
 
+  void set_journal_head(journal_seq_t head) final {
+    ceph_assert(head != JOURNAL_SEQ_NULL);
+    ceph_assert(journal_head == JOURNAL_SEQ_NULL ||
+                head >= journal_head);
+    journal_head = head;
+    gc_process.maybe_wake_on_space_used();
+  }
+
   segment_id_t allocate_segment(
       segment_seq_t, segment_type_t, data_category_t, reclaim_gen_t) final;
 
@@ -783,7 +796,11 @@ public:
 
   void update_segment_avail_bytes(segment_type_t type, paddr_t offset) final {
     segments.update_written_to(type, offset);
-    gc_process.maybe_wake_on_space_used();
+    if (type == segment_type_t::JOURNAL) {
+      set_journal_head(segments.get_journal_head());
+    } else {
+      gc_process.maybe_wake_on_space_used();
+    }
   }
 
   void update_modify_time(
@@ -812,7 +829,6 @@ public:
     journal_seq_t alloc_replay_from);
 
   void init_mkfs() {
-    auto journal_head = segments.get_journal_head();
     ceph_assert(disable_trim || journal_head != JOURNAL_SEQ_NULL);
     journal_tail_target = journal_head;
     journal_tail_committed = journal_head;
@@ -933,7 +949,7 @@ private:
     journal_seq_t limit);
 
   journal_seq_t get_dirty_tail() const {
-    auto ret = segments.get_journal_head();
+    auto ret = journal_head;
     ceph_assert(ret != JOURNAL_SEQ_NULL);
     if (ret.segment_seq >= config.target_journal_segments) {
       ret.segment_seq -= config.target_journal_segments;
@@ -945,7 +961,7 @@ private:
   }
 
   journal_seq_t get_dirty_tail_limit() const {
-    auto ret = segments.get_journal_head();
+    auto ret = journal_head;
     ceph_assert(ret != JOURNAL_SEQ_NULL);
     if (ret.segment_seq >= config.max_journal_segments) {
       ret.segment_seq -= config.max_journal_segments;
@@ -957,7 +973,7 @@ private:
   }
 
   journal_seq_t get_backref_tail() const {
-    auto ret = segments.get_journal_head();
+    auto ret = journal_head;
     ceph_assert(ret != JOURNAL_SEQ_NULL);
     if (ret.segment_seq >= config.target_backref_inflight_segments) {
       ret.segment_seq -= config.target_backref_inflight_segments;
@@ -1137,7 +1153,6 @@ private:
     if (journal_tail_committed == JOURNAL_SEQ_NULL) {
       return segments.get_num_type_journal();
     }
-    auto journal_head = segments.get_journal_head();
     assert(journal_head != JOURNAL_SEQ_NULL);
     assert(journal_head.segment_seq >= journal_tail_committed.segment_seq);
     return journal_head.segment_seq + 1 - journal_tail_committed.segment_seq;
@@ -1202,7 +1217,6 @@ private:
    * Journal sizes
    */
   std::size_t get_dirty_journal_size() const {
-    auto journal_head = segments.get_journal_head();
     if (journal_head == JOURNAL_SEQ_NULL ||
         dirty_extents_replay_from == JOURNAL_SEQ_NULL) {
       return 0;
@@ -1215,7 +1229,6 @@ private:
   }
 
   std::size_t get_alloc_journal_size() const {
-    auto journal_head = segments.get_journal_head();
     if (journal_head == JOURNAL_SEQ_NULL ||
         alloc_info_replay_from == JOURNAL_SEQ_NULL) {
       return 0;
index fd9d6c9e9916ce6b9de6467b8a6dee4676537b42..9fbf1e1886c8d4040e668e78c0a4d782ef251fe1 100644 (file)
@@ -49,6 +49,8 @@ struct btree_test_base :
   /*
    * SegmentProvider interfaces
    */
+  void set_journal_head(journal_seq_t) final {}
+
   journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
 
   const segment_info_t& get_seg_info(segment_id_t id) const final {
index ba0cf041aec0f632f002d92aea7fb4c22b92a8e6..a2ddd9203a405e3136af4fa7ea55e992da9853c3 100644 (file)
@@ -90,6 +90,8 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider {
   /*
    * SegmentProvider interfaces
    */
+  void set_journal_head(journal_seq_t) final {}
+
   journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
 
   const segment_info_t& get_seg_info(segment_id_t id) const final {