From d4f59135503393a18a9148da432bd94da1484a0a Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 27 Apr 2021 15:00:11 -0700 Subject: [PATCH] crimson/os/seastore: refactor segment_cleaner to init segment_manager params after mount Signed-off-by: Samuel Just --- src/crimson/os/seastore/segment_cleaner.h | 61 +++++++++++-------- .../os/seastore/transaction_manager.cc | 2 + src/crimson/tools/store-nbd.cc | 4 +- .../seastore/transaction_manager_test_state.h | 3 +- 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index ee291f4db23ad..db3b8bf87701d 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -212,10 +212,6 @@ class SegmentCleaner : public JournalSegmentProvider { public: /// Config struct config_t { - size_t num_segments = 0; - size_t segment_size = 0; - size_t block_size = 0; - size_t target_journal_segments = 0; size_t max_journal_segments = 0; @@ -231,12 +227,8 @@ public: /// 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) { + static config_t get_default() { return config_t{ - manager.get_num_segments(), - static_cast(manager.get_segment_size()), - (size_t)manager.get_block_size(), 2, // target_journal_segments 4, // max_journal_segments .9, // available_ratio_gc_max @@ -344,8 +336,13 @@ public: }; private: + const bool detailed; const config_t config; + size_t num_segments = 0; + size_t segment_size = 0; + size_t block_size = 0; + SpaceTrackerIRef space_tracker; std::vector segments; size_t empty_segments; @@ -368,19 +365,35 @@ private: public: SegmentCleaner(config_t config, bool detailed = false) - : config(config), - space_tracker( - detailed ? - (SpaceTrackerI*)new SpaceTrackerDetailed( - config.num_segments, - config.segment_size, - config.block_size) : - (SpaceTrackerI*)new SpaceTrackerSimple( - config.num_segments)), - segments(config.num_segments), - empty_segments(config.num_segments), + : detailed(detailed), + config(config), gc_process(*this) {} + void mount(SegmentManager &sm) { + init_complete = false; + used_bytes = 0; + journal_tail_target = journal_seq_t{}; + journal_tail_committed = journal_seq_t{}; + journal_head = journal_seq_t{}; + + num_segments = sm.get_num_segments(); + segment_size = static_cast(sm.get_segment_size()); + block_size = static_cast(sm.get_block_size()); + + space_tracker.reset( + detailed ? + (SpaceTrackerI*)new SpaceTrackerDetailed( + num_segments, + segment_size, + block_size) : + (SpaceTrackerI*)new SpaceTrackerSimple( + num_segments)); + + segments.clear(); + segments.resize(num_segments); + empty_segments = num_segments; + } + get_segment_ret get_segment() final; void close_segment(segment_id_t segment) final; @@ -664,7 +677,7 @@ private: } size_t get_bytes_available_current_segment() const { - return config.segment_size - get_bytes_used_current_segment(); + return segment_size - get_bytes_used_current_segment(); } /** @@ -682,14 +695,14 @@ private: /// Returns free space available for writes size_t get_available_bytes() const { - return (empty_segments * config.segment_size) + + return (empty_segments * segment_size) + get_bytes_available_current_segment() + get_bytes_scanned_current_segment(); } /// Returns total space available size_t get_total_bytes() const { - return config.segment_size * config.num_segments; + return segment_size * num_segments; } /// Returns total space not free @@ -706,7 +719,7 @@ private: size_t get_journal_segment_bytes() const { assert(journal_head >= journal_tail_committed); return (journal_head.segment_seq - journal_tail_committed.segment_seq + 1) * - config.segment_size; + segment_size; } /** diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 62ea036ea3b5c..c25e826c29486 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -30,6 +30,7 @@ TransactionManager::TransactionManager( TransactionManager::mkfs_ertr::future<> TransactionManager::mkfs() { LOG_PREFIX(TransactionManager::mkfs); + segment_cleaner->mount(segment_manager); return journal->open_for_write().safe_then([this, FNAME](auto addr) { DEBUG("TransactionManager::mkfs: about to do_with"); segment_cleaner->init_mkfs(addr); @@ -63,6 +64,7 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount() { LOG_PREFIX(TransactionManager::mount); cache->init(); + segment_cleaner->mount(segment_manager); return journal->replay([this](auto seq, auto paddr, const auto &e) { return cache->replay_delta(seq, paddr, e); }).safe_then([this] { diff --git a/src/crimson/tools/store-nbd.cc b/src/crimson/tools/store-nbd.cc index 065c94c7be2e9..f1a331188415b 100644 --- a/src/crimson/tools/store-nbd.cc +++ b/src/crimson/tools/store-nbd.cc @@ -632,9 +632,9 @@ public: void init() { auto segment_cleaner = std::make_unique( - SegmentCleaner::config_t::default_from_segment_manager( - *segment_manager), + SegmentCleaner::config_t::get_default(), false /* detailed */); + segment_cleaner->mount(*segment_manager); auto journal = std::make_unique(*segment_manager); auto cache = std::make_unique(*segment_manager); auto lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache); diff --git a/src/test/crimson/seastore/transaction_manager_test_state.h b/src/test/crimson/seastore/transaction_manager_test_state.h index 2fa8ebe65932e..11dcb1cbb2829 100644 --- a/src/test/crimson/seastore/transaction_manager_test_state.h +++ b/src/test/crimson/seastore/transaction_manager_test_state.h @@ -72,8 +72,7 @@ auto get_transaction_manager( SegmentManager &segment_manager ) { auto segment_cleaner = std::make_unique( - SegmentCleaner::config_t::default_from_segment_manager( - segment_manager), + SegmentCleaner::config_t::get_default(), true); auto journal = std::make_unique(segment_manager); auto cache = std::make_unique(segment_manager); -- 2.39.5