]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/segment_cleaner: cleanup SegmentProvider interfaces 45948/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Tue, 19 Apr 2022 07:40:41 +0000 (15:40 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 20 Apr 2022 02:59:31 +0000 (10:59 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/journal/segment_allocator.cc
src/crimson/os/seastore/journal/segmented_journal.cc
src/crimson/os/seastore/segment_cleaner.cc
src/crimson/os/seastore/segment_cleaner.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_seastore_journal.cc

index 50c2a9b72eccef77fce24732a4504da0d0a77ebc..e988fa818713b392e3196234c7b3aa34b6e8206b 100644 (file)
@@ -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;
index 6b2dabefbc7f0f3a572c12a440707ad39ebb5983..e27900561b9aa10c476bc00d03af8c26b5fabea7 100644 (file)
@@ -40,7 +40,7 @@ SegmentAllocator::do_open()
     new_segment_seq,
     reinterpret_cast<const unsigned char *>(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);
index 05f840e8a9801a7c49ec1393d1d9afec092d1c00..2413ba14c134781c21d8b86d2bba5f5aac7dd2fa 100644 (file)
@@ -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)) {
index 4bac8394c9cafd2d7f84c3dade2ba73750bcf182..2b0a3577bd8ee9a44658a8a770ff0fd19cb1986b 100644 (file)
@@ -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();
index 840a8e19dbde3f622fe61124d636a3d0f5de2211..7d219fd65908d4ef6da3fc02281ab26950ca33a4 100644 (file)
@@ -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) {
index 826cdc70f5280489deddc1f94f133fc5234642d2..8b30644b34d4d3778b8b2dcddcf645228a60dbcf 100644 (file)
@@ -42,20 +42,23 @@ struct btree_test_base :
   std::map<segment_id_t, segment_seq_t> segment_seqs;
   std::map<segment_id_t, segment_type_t> 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)
index 0c65e3a3ca10b72f796b56a1eecbdd63dcbc88ad..e33211fd59004eb4467027d1ec92666b64c950cc 100644 (file)
@@ -83,21 +83,23 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider {
   std::map<segment_id_t, segment_seq_t> segment_seqs;
   std::map<segment_id_t, segment_type_t> 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();