]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: check segment nonce in scan_segment
authorSamuel Just <sjust@redhat.com>
Fri, 6 Nov 2020 00:10:10 +0000 (00:10 +0000)
committerSamuel Just <sjust@redhat.com>
Fri, 11 Dec 2020 21:31:39 +0000 (13:31 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h

index fbe61bf8e90634bd6d952ddbc4f013822cb4e162..ad3b4355419d53037c77029cca1f0b518195f1ca 100644 (file)
@@ -455,6 +455,7 @@ std::optional<std::vector<extent_info_t>> Journal::try_decode_extent_infos(
 Journal::replay_ertr::future<>
 Journal::replay_segment(
   journal_seq_t seq,
+  segment_header_t header,
   delta_handler_t &handler)
 {
   logger().debug("replay_segment: starting at {}", seq);
@@ -480,10 +481,11 @@ Journal::replay_segment(
            delta);
        }
       }),
-    [this, seq](auto &dhandler) {
+    [=](auto &dhandler) {
       return scan_segment(
        seq.offset,
        segment_manager.get_segment_size(),
+       header.segment_nonce,
        &dhandler,
        nullptr).safe_then([](auto){});
     });
@@ -499,7 +501,7 @@ Journal::replay_ret Journal::replay(delta_handler_t &&delta_handler)
           logger().debug("replay: found {} segments", replay_segs.size());
           segments = std::move(replay_segs);
           return crimson::do_for_each(segments, [this, &handler](auto i) mutable {
-            return replay_segment(i.first, handler);
+            return replay_segment(i.first, i.second, handler);
           });
         });
     });
@@ -512,30 +514,38 @@ Journal::scan_extents_ret Journal::scan_extents(
   // Caller doesn't know addr of first record, so addr.offset == 0 is special
   if (addr.offset == 0) addr.offset = block_size;
 
-  return seastar::do_with(
-    scan_extents_ret_bare(),
-    [=](auto &ret) {
-      return seastar::do_with(
-       extent_handler_t([&ret](auto addr, const auto &info) mutable {
-         ret.second.push_back(std::make_pair(addr, info));
-         return scan_extents_ertr::now();
-       }),
-       [=, &ret](auto &handler) mutable {
-         return scan_segment(
-           addr,
-           bytes_to_read,
-           nullptr,
-           &handler).safe_then([&ret](auto next) mutable {
-             ret.first = next;
-             return std::move(ret);
-           });
-       });
-    });
+  return read_segment_header(addr.segment
+  ).handle_error(
+    scan_extents_ertr::pass_further{},
+    crimson::ct_error::assert_all{}
+  ).safe_then([=](auto header) {
+    return seastar::do_with(
+      scan_extents_ret_bare(),
+      [=](auto &ret) {
+       return seastar::do_with(
+         extent_handler_t([&ret](auto addr, const auto &info) mutable {
+           ret.second.push_back(std::make_pair(addr, info));
+           return scan_extents_ertr::now();
+         }),
+         [=, &ret](auto &handler) mutable {
+           return scan_segment(
+             addr,
+             bytes_to_read,
+             header.segment_nonce,
+             nullptr,
+             &handler).safe_then([&ret](auto next) mutable {
+               ret.first = next;
+               return std::move(ret);
+             });
+         });
+      });
+  });
 }
 
 Journal::scan_segment_ret Journal::scan_segment(
   paddr_t addr,
   extent_len_t bytes_to_read,
+  segment_nonce_t nonce,
   delta_scan_handler_t *delta_handler,
   extent_handler_t *extent_info_handler)
 {
@@ -555,6 +565,15 @@ Journal::scan_segment_ret Journal::scan_segment(
 
              auto &[header, bl] = *p;
 
+             if (header.segment_nonce != nonce) {
+               logger().debug(
+                 "Journal::scan_segment: record offset {} nonce mismatch {} vs {}",
+                 current,
+                 nonce,
+                 header.segment_nonce);
+               return scan_segment_ertr::make_ready_future<bool>(true);
+             }
+
              logger().debug(
                "Journal::scan_segment: next record offset {} mdlength {} dlength {}",
                current,
index d950b809be660efb04759388d5ed08b1b4026b1f..af0d0673a7b9a981dec642b934ae3ebf6f7dca89 100644 (file)
@@ -342,6 +342,7 @@ private:
   scan_segment_ret scan_segment(
     paddr_t addr,
     extent_len_t bytes_to_read,
+    segment_nonce_t nonce,
     delta_scan_handler_t *delta_handler,
     extent_handler_t *extent_info_handler
   );
@@ -350,6 +351,7 @@ private:
   replay_ertr::future<>
   replay_segment(
     journal_seq_t start,             ///< [in] starting addr, seq
+    segment_header_t header,         ///< [in] segment header
     delta_handler_t &delta_handler   ///< [in] processes deltas in order
   );