]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cbjournal: make cbjournal to store alloc_tail
authormyoungwon oh <ohmyoungwon@gmail.com>
Fri, 17 Jun 2022 05:25:10 +0000 (14:25 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Fri, 19 Aug 2022 03:41:23 +0000 (12:41 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/journal/circular_bounded_journal.cc
src/crimson/os/seastore/journal/circular_bounded_journal.h
src/test/crimson/seastore/test_cbjournal.cc

index 07d13f69a521623ddcfb7639f6f5577f9e091066..b8adef9bd4d4fa0119897e49d1cf525ac45e5ee4 100644 (file)
@@ -47,6 +47,7 @@ CircularBoundedJournal::mkfs(const mkfs_config_t& config)
       convert_abs_addr_to_paddr(
        device->get_block_size(),
        config.device_id)};
+  head.alloc_tail = head.journal_tail;
   head.device_id = config.device_id;
   encode(head, bl);
   header = head;
@@ -272,10 +273,12 @@ Journal::replay_ret CircularBoundedJournal::replay(
     DEBUG("header : {}", header);
     initialized = true;
     written_to.segment_seq = NULL_SEG_SEQ;
-    set_written_to(get_journal_tail());
+    auto tail = get_journal_tail() <= get_alloc_tail() ?
+      get_journal_tail() : get_alloc_tail();
+    set_written_to(tail);
     return seastar::do_with(
       bool(false),
-      rbm_abs_addr(get_rbm_addr(get_journal_tail())),
+      rbm_abs_addr(get_rbm_addr(tail)),
       std::move(delta_handler),
       segment_seq_t(NULL_SEG_SEQ),
       [this, FNAME](auto &is_rolled, auto &cursor_addr, auto &d_handler, auto &expected_seq) {
@@ -338,12 +341,14 @@ Journal::replay_ret CircularBoundedJournal::replay(
            journal_seq_t{expected_seq, addr});
          return seastar::do_with(
            std::move(*maybe_record_deltas_list),
-           [write_result,
+           [this,
+           write_result,
            &d_handler,
            FNAME](auto& record_deltas_list) {
            return crimson::do_for_each(
              record_deltas_list,
-             [write_result,
+             [this,
+             write_result,
              &d_handler, FNAME](record_deltas_t& record_deltas) {
              auto locator = record_locator_t{
                record_deltas.record_block_base,
@@ -354,15 +359,16 @@ Journal::replay_ret CircularBoundedJournal::replay(
                  locator);
              return crimson::do_for_each(
                record_deltas.deltas,
-               [locator,
+               [this,
+               locator,
                &d_handler](auto& p) {
                auto& modify_time = p.first;
                auto& delta = p.second;
                return d_handler(
                  locator,
                  delta,
-                 locator.write_result.start_seq,
-                 locator.write_result.start_seq,
+                 header.journal_tail,
+                 header.alloc_tail,
                  modify_time).discard_result();
              });
            }).safe_then([]() {
index 09c28b1a2f79bc4579a962fc037cddb2d7c4f900..02cda0f4131261c892b396e850dcb3841d8abf4e 100644 (file)
@@ -201,6 +201,7 @@ public:
 
     // start offset of CircularBoundedJournal in the device
     journal_seq_t journal_tail;
+    journal_seq_t alloc_tail;
 
     device_id_t device_id;
 
@@ -212,6 +213,7 @@ public:
       denc(v.size, p);
 
       denc(v.journal_tail, p);
+      denc(v.alloc_tail, p);
 
       denc(v.device_id, p);
 
@@ -248,13 +250,19 @@ public:
     return get_total_size() - get_used_size();
   }
 
-  write_ertr::future<> update_journal_tail(journal_seq_t seq) {
+  write_ertr::future<> update_journal_tail(
+    journal_seq_t seq,
+    journal_seq_t alloc_info) {
     header.journal_tail = seq;
+    header.alloc_tail = alloc_info;
     return write_header();
   }
   journal_seq_t get_journal_tail() const {
     return header.journal_tail;
   }
+  journal_seq_t get_alloc_tail() const {
+    return header.alloc_tail;
+  }
 
   write_ertr::future<> write_header();
 
index 808ae71f098e13333d662835fd961f5653b21df2..4fab32d066140fe08ff87087755f2209f7d135d3 100644 (file)
@@ -284,11 +284,15 @@ struct cbjournal_test_t : public seastar_test_suite_t, JournalTrimmer
     return cbj->get_used_size();
   }
   void update_journal_tail(rbm_abs_addr addr, uint32_t len) {
-    cbj->update_journal_tail(
-      journal_seq_t{0,
-       convert_abs_addr_to_paddr(
+    paddr_t paddr =
+      convert_abs_addr_to_paddr(
          addr + len,
-         cbj->get_device_id())}).unsafe_get0();
+         cbj->get_device_id());
+    journal_seq_t seq = {0, paddr};
+    cbj->update_journal_tail(
+      seq,
+      seq
+    ).unsafe_get0();
   }
   void set_written_to(journal_seq_t seq) {
     cbj->set_written_to(seq);