From: Yingxin Cheng Date: Wed, 20 Jul 2022 04:14:46 +0000 (+0800) Subject: crimson/os/seastore/async_cleaner: re-introduce journal_header member X-Git-Tag: v18.0.0~464^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=85950c0646f81eb5703e8bb3b4876dc70786a07a;p=ceph.git crimson/os/seastore/async_cleaner: re-introduce journal_header member RBM won't have segments_info_t, it has to maintain the journal_header by itself. Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/async_cleaner.cc b/src/crimson/os/seastore/async_cleaner.cc index e0d198be78fc1..3f9e00c4d4e96 100644 --- a/src/crimson/os/seastore/async_cleaner.cc +++ b/src/crimson/os/seastore/async_cleaner.cc @@ -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(), diff --git a/src/crimson/os/seastore/async_cleaner.h b/src/crimson/os/seastore/async_cleaner.h index 94791486ff9ef..4e3f43f248ba8 100644 --- a/src/crimson/os/seastore/async_cleaner.h +++ b/src/crimson/os/seastore/async_cleaner.h @@ -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; diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index fd9d6c9e9916c..9fbf1e1886c8d 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -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 { diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index ba0cf041aec0f..a2ddd9203a405 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -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 {