From e56b2759b4180bd6c9d72f35fbcde34cadb2a032 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 17 Aug 2022 14:51:06 +0800 Subject: [PATCH] crimson/os/seastore/async_cleaner: cleanup and sort interfaces To prepare for a general interface class for device tiering. Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/async_cleaner.cc | 39 ++++++++ src/crimson/os/seastore/async_cleaner.h | 97 ++++++++++--------- .../seastore/test_transaction_manager.cc | 35 +------ 3 files changed, 89 insertions(+), 82 deletions(-) diff --git a/src/crimson/os/seastore/async_cleaner.cc b/src/crimson/os/seastore/async_cleaner.cc index 9dc34d56fca..3ead6ff0127 100644 --- a/src/crimson/os/seastore/async_cleaner.cc +++ b/src/crimson/os/seastore/async_cleaner.cc @@ -6,6 +6,7 @@ #include "crimson/os/seastore/logging.h" #include "crimson/os/seastore/async_cleaner.h" +#include "crimson/os/seastore/backref_manager.h" #include "crimson/os/seastore/transaction_manager.h" SET_SUBSYS(seastore_cleaner); @@ -1218,6 +1219,44 @@ seastar::future<> AsyncCleaner::stop() }); } +bool AsyncCleaner::check_usage() +{ + SpaceTrackerIRef tracker(space_tracker->make_empty()); + ecb->with_transaction_weak( + "check_usage", + [this, &tracker](auto &t) { + return backref_manager.scan_mapped_space( + t, + [&tracker]( + paddr_t paddr, + extent_len_t len, + extent_types_t type, + laddr_t laddr) + { + if (paddr.get_addr_type() == paddr_types_t::SEGMENT) { + if (is_backref_node(type)) { + assert(laddr == L_ADDR_NULL); + tracker->allocate( + paddr.as_seg_paddr().get_segment_id(), + paddr.as_seg_paddr().get_segment_off(), + len); + } else if (laddr == L_ADDR_NULL) { + tracker->release( + paddr.as_seg_paddr().get_segment_id(), + paddr.as_seg_paddr().get_segment_off(), + len); + } else { + tracker->allocate( + paddr.as_seg_paddr().get_segment_id(), + paddr.as_seg_paddr().get_segment_off(), + len); + } + } + }); + }).unsafe_get0(); + return space_tracker->equals(*tracker); +} + void AsyncCleaner::mark_space_used( paddr_t addr, extent_len_t len) diff --git a/src/crimson/os/seastore/async_cleaner.h b/src/crimson/os/seastore/async_cleaner.h index 91ccce27eb1..3d0cbf55ca9 100644 --- a/src/crimson/os/seastore/async_cleaner.h +++ b/src/crimson/os/seastore/async_cleaner.h @@ -10,7 +10,6 @@ #include "osd/osd_types.h" -#include "crimson/os/seastore/backref_manager.h" #include "crimson/os/seastore/cached_extent.h" #include "crimson/os/seastore/seastore_types.h" #include "crimson/os/seastore/segment_manager.h" @@ -526,6 +525,8 @@ public: bool equals(const SpaceTrackerI &other) const; }; +class BackrefManager; + class AsyncCleaner : public SegmentProvider, public JournalTrimmer { enum class cleaner_state_t { STOP, @@ -798,6 +799,7 @@ private: * Should be removed once proper support is added. TODO */ bool disable_trim = false; + public: AsyncCleaner( config_t config, @@ -809,26 +811,35 @@ public: return *ool_segment_seq_allocator; } + void set_extent_callback(ExtentCallbackInterface *cb) { + ecb = cb; + } + using mount_ertr = crimson::errorator< crimson::ct_error::input_output_error>; using mount_ret = mount_ertr::future<>; mount_ret mount(); + void start_scan_space() { + ceph_assert(state == cleaner_state_t::MOUNT); + state = cleaner_state_t::SCAN_SPACE; + assert(space_tracker->equals(*space_tracker->make_empty())); + } + + void start_gc(); + bool is_ready() const { return state >= cleaner_state_t::READY; } /* - * SegmentProvider interfaces + * JournalTrimmer interfaces */ + journal_seq_t get_journal_head() const final { return journal_head; } - const segment_info_t& get_seg_info(segment_id_t id) const final { - 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 || @@ -848,6 +859,25 @@ public: gc_process.maybe_wake_on_space_used(); } + journal_seq_t get_dirty_tail() const final { + return journal_dirty_tail; + } + + journal_seq_t get_alloc_tail() const final { + return journal_alloc_tail; + } + + void update_journal_tails( + journal_seq_t dirty_tail, journal_seq_t alloc_tail) final; + + /* + * SegmentProvider interfaces + */ + + const segment_info_t& get_seg_info(segment_id_t id) const final { + return segments[id]; + } + segment_id_t allocate_segment( segment_seq_t, segment_type_t, data_category_t, reclaim_gen_t) final; @@ -868,25 +898,6 @@ public: return sm_group.get(); } - journal_seq_t get_dirty_tail() const final { - return journal_dirty_tail; - } - - journal_seq_t get_alloc_tail() const final { - return journal_alloc_tail; - } - - void update_journal_tails( - journal_seq_t dirty_tail, journal_seq_t alloc_tail) final; - - void adjust_segment_util(double old_usage, double new_usage) { - auto old_index = get_bucket_index(old_usage); - auto new_index = get_bucket_index(new_usage); - assert(stats.segment_util.buckets[old_index].count > 0); - stats.segment_util.buckets[old_index].count--; - stats.segment_util.buckets[new_index].count++; - } - void mark_space_used( paddr_t addr, extent_len_t len); @@ -895,17 +906,9 @@ public: paddr_t addr, extent_len_t len); - SpaceTrackerIRef get_empty_space_tracker() const { - return space_tracker->make_empty(); - } - - void start_scan_space() { - ceph_assert(state == cleaner_state_t::MOUNT); - state = cleaner_state_t::SCAN_SPACE; - assert(debug_check_space(*get_empty_space_tracker())); - } + seastar::future<> reserve_projected_usage(std::size_t projected_usage); - void start_gc(); + void release_projected_usage(size_t projected_usage); store_statfs_t stat() const { store_statfs_t st; @@ -921,18 +924,14 @@ public: seastar::future<> stop(); + // Testing interfaces + seastar::future<> run_until_halt() { ceph_assert(state == cleaner_state_t::HALT); return gc_process.run_until_halt(); } - void set_extent_callback(ExtentCallbackInterface *cb) { - ecb = cb; - } - - bool debug_check_space(const SpaceTrackerI &tracker) { - return space_tracker->equals(tracker); - } + bool check_usage(); void set_disable_trim(bool val) { disable_trim = val; @@ -1299,12 +1298,6 @@ private: void log_gc_state(const char *caller) const; -public: - seastar::future<> reserve_projected_usage(std::size_t projected_usage); - - void release_projected_usage(size_t projected_usage); - -private: void maybe_wake_gc_blocked_io() { if (!is_ready()) { return; @@ -1363,6 +1356,14 @@ private: || gc_should_trim_alloc(); } + void adjust_segment_util(double old_usage, double new_usage) { + auto old_index = get_bucket_index(old_usage); + auto new_index = get_bucket_index(new_usage); + assert(stats.segment_util.buckets[old_index].count > 0); + stats.segment_util.buckets[old_index].count--; + stats.segment_util.buckets[new_index].count++; + } + void init_mark_segment_closed( segment_id_t segment, segment_seq_t seq, diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index aa61f167ba7..87a389759af 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -400,40 +400,7 @@ struct transaction_manager_test_t : } bool check_usage() { - auto t = create_weak_test_transaction(); - SpaceTrackerIRef tracker(async_cleaner->get_empty_space_tracker()); - with_trans_intr( - *t.t, - [this, &tracker](auto &t) { - return backref_manager->scan_mapped_space( - t, - [&tracker]( - paddr_t paddr, - extent_len_t len, - extent_types_t type, - laddr_t laddr) { - if (paddr.get_addr_type() == paddr_types_t::SEGMENT) { - if (is_backref_node(type)) { - assert(laddr == L_ADDR_NULL); - tracker->allocate( - paddr.as_seg_paddr().get_segment_id(), - paddr.as_seg_paddr().get_segment_off(), - len); - } else if (laddr == L_ADDR_NULL) { - tracker->release( - paddr.as_seg_paddr().get_segment_id(), - paddr.as_seg_paddr().get_segment_off(), - len); - } else { - tracker->allocate( - paddr.as_seg_paddr().get_segment_id(), - paddr.as_seg_paddr().get_segment_off(), - len); - } - } - }); - }).unsafe_get0(); - return async_cleaner->debug_check_space(*tracker); + return async_cleaner->check_usage(); } void replay() { -- 2.39.5