]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: add interface for trimming the journal
authorSamuel Just <sjust@redhat.com>
Fri, 7 Aug 2020 22:08:18 +0000 (15:08 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 23 Sep 2020 22:13:52 +0000 (15:13 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h
src/crimson/os/seastore/transaction_manager.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_seastore_journal.cc

index 26f894faf1e2094b9e2130d86d9b89da00cd8324..fe2594c3119835e4fe7749a2618420aebec715b2 100644 (file)
@@ -28,18 +28,25 @@ Journal::Journal(SegmentManager &segment_manager)
 Journal::initialize_segment_ertr::future<> Journal::initialize_segment(
   Segment &segment)
 {
-  logger().debug("initialize_segment {}", segment.get_segment_id());
+  auto new_tail = segment_provider->get_journal_tail_target();
+  logger().debug(
+    "initialize_segment {} journal_tail_target {}",
+    segment.get_segment_id(),
+    new_tail);
   // write out header
   ceph_assert(segment.get_write_ptr() == 0);
   bufferlist bl;
   auto header = segment_header_t{
     current_journal_segment_seq++,
     segment.get_segment_id(),
-    current_replay_point};
+    segment_provider->get_journal_tail_target()};
   ::encode(header, bl);
 
   written_to = segment_manager.get_block_size();
-  return segment.write(0, bl).handle_error(
+  return segment.write(0, bl).safe_then(
+    [=] {
+      segment_provider->update_journal_tail_committed(new_tail);
+    },
     init_ertr::pass_further{},
     crimson::ct_error::assert_all{ "TODO" });
 }
@@ -211,7 +218,7 @@ Journal::find_replay_segments_fut Journal::find_replay_segments()
                rt.second.journal_segment_seq;
            });
 
-         auto replay_from = segments.rbegin()->second.journal_tail;
+         auto replay_from = segments.rbegin()->second.journal_tail.offset;
          auto from = segments.begin();
          if (replay_from != P_ADDR_NULL) {
            from = std::find_if(
index 6556a4a8bebae034449eb9f91e484cb3b6974417..ab65f5f29e557b4b8e6b1bb941d46509f9424feb 100644 (file)
@@ -35,7 +35,7 @@ struct segment_header_t {
   segment_seq_t journal_segment_seq;
   segment_id_t physical_segment_id; // debugging
 
-  paddr_t journal_tail;
+  journal_seq_t journal_tail;
 
   DENC(segment_header_t, v, p) {
     DENC_START(1, 1, p);
@@ -80,6 +80,9 @@ public:
   /* TODO: we'll want to use this to propogate information about segment contents */
   virtual void put_segment(segment_id_t segment) = 0;
 
+  virtual journal_seq_t get_journal_tail_target() const = 0;
+  virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0;
+
   virtual ~JournalSegmentProvider() {}
 };
 
@@ -170,8 +173,6 @@ private:
   JournalSegmentProvider *segment_provider = nullptr;
   SegmentManager &segment_manager;
 
-  paddr_t current_replay_point;
-
   segment_seq_t current_journal_segment_seq = 0;
 
   SegmentRef current_journal_segment;
index 5b6f03f115195928b59cd88d7e9abb20687a6bda..ea4a1cf0f99522c791ba484f20a21181130e88eb 100644 (file)
@@ -55,6 +55,14 @@ public:
     return;
   }
 
+  journal_seq_t get_journal_tail_target() const final {
+    // TODO -- part of gc
+    return journal_seq_t{};
+  }
+  void update_journal_tail_committed(journal_seq_t committed) final {
+    // TODO -- part of gc
+  }
+
   /// Writes initial metadata to disk
   using mkfs_ertr = crimson::errorator<
     crimson::ct_error::input_output_error
index 4381ef557504b8bdc6ca267426cfdb6ba4ba11e4..71ddbb29c8754a2a7ecf290e7784c1a479f19c78 100644 (file)
@@ -54,6 +54,9 @@ struct btree_lba_manager_test :
     return;
   }
 
+  journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
+  void update_journal_tail_committed(journal_seq_t committed) final {}
+
   auto submit_transaction(TransactionRef t)
   {
     auto record = cache.try_construct_record(*t);
index f54e8645292b37d9b87ec75da61791f25b91fdeb..ef5c1efa44b160ef1f282b73a437d418ffaa0282 100644 (file)
@@ -89,6 +89,9 @@ struct journal_test_t : seastar_test_suite_t, JournalSegmentProvider {
     return;
   }
 
+  journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
+  void update_journal_tail_committed(journal_seq_t paddr) final {}
+
   seastar::future<> set_up_fut() final {
     journal.reset(new Journal(*segment_manager));
     journal->set_segment_provider(this);