]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: refactor segment_cleaner to init segment_manager params after...
authorSamuel Just <sjust@redhat.com>
Tue, 27 Apr 2021 22:00:11 +0000 (15:00 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 7 May 2021 07:36:44 +0000 (00:36 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/segment_cleaner.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/tools/store-nbd.cc
src/test/crimson/seastore/transaction_manager_test_state.h

index ee291f4db23ad9b0cd48d4cef23ea2be483c77a1..db3b8bf87701d256a659f1dbc70a12fdbb4c06c9 100644 (file)
@@ -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<size_t>(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<segment_info_t> 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<size_t>(sm.get_segment_size());
+    block_size = static_cast<size_t>(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;
   }
 
   /**
index 62ea036ea3b5caffd20c58d4c8d3437a86a48e65..c25e826c294868d4d4725fb5842266fef294cada 100644 (file)
@@ -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] {
index 065c94c7be2e9af49b8fa949b58868840b608e30..f1a331188415ba591318d94b421b38be4f3cd39b 100644 (file)
@@ -632,9 +632,9 @@ public:
 
   void init() {
     auto segment_cleaner = std::make_unique<SegmentCleaner>(
-      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<Journal>(*segment_manager);
     auto cache = std::make_unique<Cache>(*segment_manager);
     auto lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache);
index 2fa8ebe65932eb6990bc29c31b1e21e651f52fe6..11dcb1cbb2829f42eeb62832348baf3815052754 100644 (file)
@@ -72,8 +72,7 @@ auto get_transaction_manager(
   SegmentManager &segment_manager
 ) {
   auto segment_cleaner = std::make_unique<SegmentCleaner>(
-    SegmentCleaner::config_t::default_from_segment_manager(
-      segment_manager),
+    SegmentCleaner::config_t::get_default(),
     true);
   auto journal = std::make_unique<Journal>(segment_manager);
   auto cache = std::make_unique<Cache>(segment_manager);