From: Yingxin Cheng Date: Tue, 19 Apr 2022 07:40:41 +0000 (+0800) Subject: crimson/os/seastore/segment_cleaner: cleanup SegmentProvider interfaces X-Git-Tag: v18.0.0~1018^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F45948%2Fhead;p=ceph.git crimson/os/seastore/segment_cleaner: cleanup SegmentProvider interfaces Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 50c2a9b72ecc..e988fa818713 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -987,6 +987,14 @@ record_t Cache::prepare_record( std::move(delta_bl) }); } else { + auto sseq = NULL_SEG_SEQ; + auto stype = segment_type_t::NULL_SEG; + if (cleaner != nullptr) { + auto sid = i->get_paddr().as_seg_paddr().get_segment_id(); + auto &sinfo = cleaner->get_seg_info(sid); + sseq = sinfo.seq; + stype = sinfo.type; + } record.push_back( delta_info_t{ i->get_type(), @@ -998,12 +1006,8 @@ record_t Cache::prepare_record( final_crc, (seastore_off_t)i->get_length(), i->get_version() - 1, - cleaner - ? cleaner->get_seq(i->get_paddr().as_seg_paddr().get_segment_id()) - : MAX_SEG_SEQ, - cleaner - ? cleaner->get_type(i->get_paddr().as_seg_paddr().get_segment_id()) - : segment_type_t::NULL_SEG, + sseq, + stype, std::move(delta_bl) }); i->last_committed_crc = final_crc; diff --git a/src/crimson/os/seastore/journal/segment_allocator.cc b/src/crimson/os/seastore/journal/segment_allocator.cc index 6b2dabefbc7f..e27900561b9a 100644 --- a/src/crimson/os/seastore/journal/segment_allocator.cc +++ b/src/crimson/os/seastore/journal/segment_allocator.cc @@ -40,7 +40,7 @@ SegmentAllocator::do_open() new_segment_seq, reinterpret_cast(meta.seastore_id.bytes()), sizeof(meta.seastore_id.uuid)); - auto new_segment_id = segment_provider.get_segment(new_segment_seq, type); + auto new_segment_id = segment_provider.allocate_segment(new_segment_seq, type); ceph_assert(new_segment_id != NULL_SEG_ID); return sm_group.open(new_segment_id ).handle_error( @@ -106,7 +106,7 @@ SegmentAllocator::do_open() DEBUG("{} rolled new segment id={}", print_name, current_segment->get_segment_id()); ceph_assert(new_journal_seq.segment_seq == - segment_provider.get_seq(current_segment->get_segment_id())); + segment_provider.get_seg_info(current_segment->get_segment_id()).seq); return new_journal_seq; }); }); @@ -147,7 +147,7 @@ SegmentAllocator::write(ceph::bufferlist to_write) auto write_length = to_write.length(); auto write_start_offset = written_to; auto write_start_seq = journal_seq_t{ - segment_provider.get_seq(current_segment->get_segment_id()), + segment_provider.get_seg_info(current_segment->get_segment_id()).seq, paddr_t::make_seg_paddr( current_segment->get_segment_id(), write_start_offset) }; @@ -208,8 +208,7 @@ SegmentAllocator::close_segment(bool is_rolling) if (is_rolling) { segment_provider.close_segment(close_segment_id); } - segment_seq_t cur_segment_seq = - segment_provider.get_seq(seg_to_close->get_segment_id()); + auto close_seg_info = segment_provider.get_seg_info(close_segment_id); journal_seq_t cur_journal_tail; if (type == segment_type_t::JOURNAL) { cur_journal_tail = segment_provider.get_journal_tail_target(); @@ -217,21 +216,19 @@ SegmentAllocator::close_segment(bool is_rolling) cur_journal_tail = NO_DELTAS; } auto tail = segment_tail_t{ - segment_provider.get_seq(close_segment_id), + close_seg_info.seq, close_segment_id, cur_journal_tail, current_segment_nonce, type, - segment_provider.get_last_modified( - close_segment_id).time_since_epoch().count(), - segment_provider.get_last_rewritten( - close_segment_id).time_since_epoch().count()}; + close_seg_info.last_modified.time_since_epoch().count(), + close_seg_info.last_rewritten.time_since_epoch().count()}; ceph::bufferlist bl; encode(tail, bl); INFO("{} close segment id={}, seq={}, written_to={}, nonce={}, journal_tail={}", print_name, close_segment_id, - cur_segment_seq, + close_seg_info.seq, written_to, current_segment_nonce, tail.journal_tail); diff --git a/src/crimson/os/seastore/journal/segmented_journal.cc b/src/crimson/os/seastore/journal/segmented_journal.cc index 05f840e8a980..2413ba14c134 100644 --- a/src/crimson/os/seastore/journal/segmented_journal.cc +++ b/src/crimson/os/seastore/journal/segmented_journal.cc @@ -205,8 +205,9 @@ SegmentedJournal::replay_segment( */ if (delta.paddr != P_ADDR_NULL) { auto& seg_addr = delta.paddr.as_seg_paddr(); - auto delta_paddr_segment_seq = segment_provider.get_seq(seg_addr.get_segment_id()); - auto delta_paddr_segment_type = segment_provider.get_type(seg_addr.get_segment_id()); + auto& seg_info = segment_provider.get_seg_info(seg_addr.get_segment_id()); + auto delta_paddr_segment_seq = seg_info.seq; + auto delta_paddr_segment_type = seg_info.type; if (s_type == segment_type_t::NULL_SEG || (delta_paddr_segment_seq != delta.ext_seq || delta_paddr_segment_type != delta.seg_type)) { diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index 4bac8394c9ca..2b0a3577bd8e 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -452,11 +452,11 @@ void SegmentCleaner::register_metrics() }); } -segment_id_t SegmentCleaner::get_segment( +segment_id_t SegmentCleaner::allocate_segment( segment_seq_t seq, segment_type_t type) { - LOG_PREFIX(SegmentCleaner::get_segment); + LOG_PREFIX(SegmentCleaner::allocate_segment); assert(seq != NULL_SEG_SEQ); for (auto it = segments.begin(); it != segments.end(); diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 840a8e19dbde..7d219fd65908 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -185,24 +185,16 @@ private: */ class SegmentProvider { public: - virtual segment_id_t get_segment( - segment_seq_t seq, segment_type_t type) = 0; - - virtual void close_segment(segment_id_t) {} - virtual journal_seq_t get_journal_tail_target() const = 0; - virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0; - - virtual segment_seq_t get_seq(segment_id_t id) { return 0; } + virtual const segment_info_t& get_seg_info(segment_id_t id) const = 0; - virtual segment_type_t get_type(segment_id_t id) = 0; + virtual segment_id_t allocate_segment( + segment_seq_t seq, segment_type_t type) = 0; - virtual seastar::lowres_system_clock::time_point get_last_modified( - segment_id_t id) const = 0; + virtual void close_segment(segment_id_t) = 0; - virtual seastar::lowres_system_clock::time_point get_last_rewritten( - segment_id_t id) const = 0; + virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0; virtual void update_segment_avail_bytes(paddr_t offset) = 0; @@ -612,16 +604,31 @@ public: using mount_ret = mount_ertr::future<>; mount_ret mount(); - segment_id_t get_segment( + /* + * SegmentProvider interfaces + */ + journal_seq_t get_journal_tail_target() const final { + return journal_tail_target; + } + + const segment_info_t& get_seg_info(segment_id_t id) const final { + return segments[id]; + } + + segment_id_t allocate_segment( segment_seq_t seq, segment_type_t type) final; void close_segment(segment_id_t segment) final; - journal_seq_t get_journal_tail_target() const final { - return journal_tail_target; + void update_journal_tail_committed(journal_seq_t committed) final; + + void update_segment_avail_bytes(paddr_t offset) final { + segments.update_written_to(offset); } - void update_journal_tail_committed(journal_seq_t committed) final; + SegmentManagerGroup* get_segment_manager_group() final { + return sm_group.get(); + } void update_journal_tail_target(journal_seq_t target); @@ -638,22 +645,6 @@ public: gc_process.maybe_wake_on_space_used(); } - void update_segment_avail_bytes(paddr_t offset) final { - segments.update_written_to(offset); - } - - segment_seq_t get_seq(segment_id_t id) final { - return segments[id].seq; - } - - segment_type_t get_type(segment_id_t id) final { - return segments[id].type; - } - - SegmentManagerGroup* get_segment_manager_group() final { - return sm_group.get(); - } - using release_ertr = SegmentManagerGroup::release_ertr; release_ertr::future<> maybe_release_segment(Transaction &t); @@ -694,16 +685,6 @@ public: assert(ret > 0); } - seastar::lowres_system_clock::time_point get_last_modified( - segment_id_t id) const final { - return segments[id].last_modified; - } - - seastar::lowres_system_clock::time_point get_last_rewritten( - segment_id_t id) const final { - return segments[id].last_rewritten; - } - void mark_space_free( paddr_t addr, extent_len_t len) { diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 826cdc70f528..8b30644b34d4 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -42,20 +42,23 @@ struct btree_test_base : std::map segment_seqs; std::map segment_types; + mutable segment_info_t tmp_info; + btree_test_base() = default; - seastar::lowres_system_clock::time_point get_last_modified( - segment_id_t id) const final { - return seastar::lowres_system_clock::time_point(); - } + /* + * SegmentProvider interfaces + */ + journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; } - seastar::lowres_system_clock::time_point get_last_rewritten( - segment_id_t id) const final { - return seastar::lowres_system_clock::time_point(); + const segment_info_t& get_seg_info(segment_id_t id) const final { + tmp_info = {}; + tmp_info.seq = segment_seqs.at(id); + tmp_info.type = segment_types.at(id); + return tmp_info; } - void update_segment_avail_bytes(paddr_t offset) final {} - segment_id_t get_segment( + segment_id_t allocate_segment( segment_seq_t seq, segment_type_t type ) final { @@ -68,19 +71,13 @@ struct btree_test_base : return ret; } - journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; } + void close_segment(segment_id_t) final {} void update_journal_tail_committed(journal_seq_t committed) final {} - SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); } - - segment_seq_t get_seq(segment_id_t id) final { - return segment_seqs[id]; - } + void update_segment_avail_bytes(paddr_t offset) final {} - segment_type_t get_type(segment_id_t id) final { - return segment_types[id]; - } + SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); } virtual void complete_commit(Transaction &t) {} seastar::future<> submit_transaction(TransactionRef t) diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index 0c65e3a3ca10..e33211fd5900 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -83,21 +83,23 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider { std::map segment_seqs; std::map segment_types; + mutable segment_info_t tmp_info; + journal_test_t() = default; - seastar::lowres_system_clock::time_point get_last_modified( - segment_id_t id) const final { - return seastar::lowres_system_clock::time_point(); - } + /* + * SegmentProvider interfaces + */ + journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; } - seastar::lowres_system_clock::time_point get_last_rewritten( - segment_id_t id) const final { - return seastar::lowres_system_clock::time_point(); + const segment_info_t& get_seg_info(segment_id_t id) const final { + tmp_info = {}; + tmp_info.seq = segment_seqs.at(id); + tmp_info.type = segment_types.at(id); + return tmp_info; } - void update_segment_avail_bytes(paddr_t offset) final {} - - segment_id_t get_segment( + segment_id_t allocate_segment( segment_seq_t seq, segment_type_t type ) final { @@ -110,19 +112,13 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider { return ret; } - journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; } + void close_segment(segment_id_t) final {} void update_journal_tail_committed(journal_seq_t paddr) final {} - SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); } - - segment_seq_t get_seq(segment_id_t id) final { - return segment_seqs[id]; - } + void update_segment_avail_bytes(paddr_t offset) final {} - segment_type_t get_type(segment_id_t id) final { - return segment_types[id]; - } + SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); } seastar::future<> set_up_fut() final { segment_manager = segment_manager::create_test_ephemeral();