]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: consider dirty tail during replay
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 22 Jul 2022 09:00:51 +0000 (17:00 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 22 Jul 2022 09:32:20 +0000 (17:32 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/journal.h
src/crimson/os/seastore/journal/circular_bounded_journal.cc
src/crimson/os/seastore/journal/segmented_journal.cc
src/crimson/os/seastore/transaction_manager.cc
src/test/crimson/seastore/test_cbjournal.cc
src/test/crimson/seastore/test_seastore_journal.cc

index ff127f14c47aab324fdf06ee78fc0f90569693e7..1093180203295004b7d7cf41f12cf77a69b5f27e 100644 (file)
@@ -1598,30 +1598,28 @@ Cache::replay_delta(
   journal_seq_t journal_seq,
   paddr_t record_base,
   const delta_info_t &delta,
+  const journal_seq_t &dirty_tail,
   const journal_seq_t &alloc_tail,
   sea_time_point &modify_time)
 {
   LOG_PREFIX(Cache::replay_delta);
+  assert(dirty_tail != JOURNAL_SEQ_NULL);
   assert(alloc_tail != JOURNAL_SEQ_NULL);
   ceph_assert(modify_time != NULL_TIME);
-  if (delta.type == extent_types_t::ROOT) {
-    TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}",
-          journal_seq, record_base, delta, *root);
-    remove_extent(root);
-    root->apply_delta_and_adjust_crc(record_base, delta.bl);
-    root->dirty_from_or_retired_at = journal_seq;
-    root->state = CachedExtent::extent_state_t::DIRTY;
-    DEBUG("replayed root delta at {} {}, add extent -- {}, root={}",
-          journal_seq, record_base, delta, *root);
-    root->set_modify_time(modify_time);
-    add_extent(root);
+
+  if (delta.type == extent_types_t::JOURNAL_TAIL) {
+    // this delta should have been dealt with during segment cleaner mounting
     return replay_delta_ertr::now();
-  } else if (delta.type == extent_types_t::ALLOC_INFO) {
+  }
+
+  // replay alloc
+  if (delta.type == extent_types_t::ALLOC_INFO) {
     if (journal_seq < alloc_tail) {
       DEBUG("journal_seq {} < alloc_tail {}, don't replay {}",
        journal_seq, alloc_tail, delta);
       return replay_delta_ertr::now();
     }
+
     alloc_delta_t alloc_delta;
     decode(alloc_delta, delta.bl);
     std::vector<backref_buf_entry_ref> backref_list;
@@ -1640,11 +1638,30 @@ Cache::replay_delta(
          alloc_blk.type,
          journal_seq));
     }
-    if (!backref_list.empty())
+    if (!backref_list.empty()) {
       backref_batch_update(std::move(backref_list), journal_seq);
+    }
     return replay_delta_ertr::now();
-  } else if (delta.type == extent_types_t::JOURNAL_TAIL) {
-    // this delta should have been dealt with during segment cleaner mounting
+  }
+
+  // replay dirty
+  if (journal_seq < dirty_tail) {
+    DEBUG("journal_seq {} < dirty_tail {}, don't replay {}",
+      journal_seq, alloc_tail, delta);
+    return replay_delta_ertr::now();
+  }
+
+  if (delta.type == extent_types_t::ROOT) {
+    TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}",
+          journal_seq, record_base, delta, *root);
+    remove_extent(root);
+    root->apply_delta_and_adjust_crc(record_base, delta.bl);
+    root->dirty_from_or_retired_at = journal_seq;
+    root->state = CachedExtent::extent_state_t::DIRTY;
+    DEBUG("replayed root delta at {} {}, add extent -- {}, root={}",
+          journal_seq, record_base, delta, *root);
+    root->set_modify_time(modify_time);
+    add_extent(root);
     return replay_delta_ertr::now();
   } else {
     auto _get_extent_if_cached = [this](paddr_t addr)
index 76fb5370896981062700997fac089f52b44bf177..e763264d41dcdb607c310fe41f296d652b2394e3 100644 (file)
@@ -763,8 +763,8 @@ public:
     journal_seq_t seq,
     paddr_t record_block_base,
     const delta_info_t &delta,
-    const journal_seq_t &, // journal seq from which alloc
-                          // delta should be replayed
+    const journal_seq_t &dirty_tail,
+    const journal_seq_t &alloc_tail,
     sea_time_point &modify_time);
 
   /**
index f50d229f32ddee7cb60194b5bd877f2ae247810d..05a8434a33dba96a6a8e7a909a4dd2b0f98c0ed0 100644 (file)
@@ -93,8 +93,8 @@ public:
   using delta_handler_t = std::function<
     replay_ret(const record_locator_t&,
               const delta_info_t&,
-              const journal_seq_t, // journal seq from which
-                                   // alloc delta should replayed
+              const journal_seq_t&, // dirty_tail
+              const journal_seq_t&, // alloc_tail
               sea_time_point modify_time)>;
   virtual replay_ret replay(
     delta_handler_t &&delta_handler) = 0;
index 766dbe7cba6d5db9478f4f54b63dba462f3bee0d..289b3fa4383538a832ad971b05c25d93d8109182 100644 (file)
@@ -392,9 +392,11 @@ Journal::replay_ret CircularBoundedJournal::replay(
                &d_handler](auto& p) {
                auto& modify_time = p.first;
                auto& delta = p.second;
-               return d_handler(locator,
+               return d_handler(
+                 locator,
                  delta,
                  locator.write_result.start_seq,
+                 locator.write_result.start_seq,
                  modify_time);
              });
            }).safe_then([]() {
index 24ada40f73664ecd3b519e4b009060fa47679de6..a8b3c043a6fde07ff131fac02a734d01636e1e96 100644 (file)
@@ -309,6 +309,7 @@ SegmentedJournal::replay_segment(
            return handler(
              locator,
              delta,
+             segment_provider.get_dirty_tail(),
              segment_provider.get_alloc_tail(),
               modify_time);
           });
index a02221de57235051181ea99cb37549cd9dc123a0..272c66958f671bb854f03f39ed41398d6805574d 100644 (file)
@@ -91,7 +91,8 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
       [this](
        const auto &offsets,
        const auto &e,
-       const journal_seq_t alloc_tail,
+       const journal_seq_t &dirty_tail,
+       const journal_seq_t &alloc_tail,
        auto modify_time)
       {
        auto start_seq = offsets.write_result.start_seq;
@@ -102,6 +103,7 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
          start_seq,
          offsets.record_block_base,
          e,
+         dirty_tail,
          alloc_tail,
          modify_time);
       });
index 0d1709c62eece5f5bff4a3b4ecec013bfab81748..58cce663a926633c6fd2ac2476485f997d568012 100644 (file)
@@ -212,7 +212,11 @@ struct cbjournal_test_t : public seastar_test_suite_t
 
   auto replay() {
     cbj->replay(
-      [this](const auto &offsets, const auto &e, auto j_seq, auto last_modified) 
+      [this](const auto &offsets,
+             const auto &e,
+             auto &dirty_seq,
+             auto &alloc_seq,
+             auto last_modified)
       -> Journal::replay_ret {
       bool found = false;
       for (auto &i : entries) {
index 3b116482ca188f77db2a5310c0096f7a4c87ae5c..2a0f6b16f83aae2b7c88777eb2a1b53c41f95ae2 100644 (file)
@@ -197,7 +197,8 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider {
        &delta_checker]
       (const auto &offsets,
        const auto &di,
-       const journal_seq_t,
+       const journal_seq_t &,
+       const journal_seq_t &,
        auto t) mutable {
        if (!delta_checker) {
          EXPECT_FALSE("No Deltas Left");