]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: replace scan_segment with scan_valid_records in replay_s...
authorSamuel Just <sjust@redhat.com>
Sat, 21 Nov 2020 03:09:54 +0000 (19:09 -0800)
committerSamuel Just <sjust@redhat.com>
Sat, 12 Dec 2020 02:18:19 +0000 (18:18 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc

index 6dc9b2303851d98612f01bfc7c8a3e84e6a5620f..a7ccb55c847b92e994ee44fb6a10b278fe176b1c 100644 (file)
@@ -530,34 +530,57 @@ Journal::replay_segment(
 {
   logger().debug("replay_segment: starting at {}", seq);
   return seastar::do_with(
-    delta_scan_handler_t(
-      [=, &handler](auto addr, auto base, const auto &delta) {
-       /* The journal may validly contain deltas for extents in since released
-        * segments.  We can detect those cases by whether the segment in question
-        * currently has a sequence number > the current journal segment seq.
-        * We can safely skip these deltas because the extent must already have
-        * been rewritten.
-        *
-        * Note, this comparison exploits the fact that SEGMENT_SEQ_NULL is
-        * a large number.
-        */
-       if (delta.paddr != P_ADDR_NULL &&
-           segment_provider->get_seq(delta.paddr.segment) > seq.segment_seq) {
-         return replay_ertr::now();
-       } else {
-         return handler(
-           journal_seq_t{seq.segment_seq, addr},
-           base,
-           delta);
+    scan_valid_records_cursor(seq.offset),
+    found_record_handler_t(
+      [=, &handler](paddr_t base,
+                   const record_header_t &header,
+                   const bufferlist &mdbuf) {
+       auto deltas = try_decode_deltas(
+         header,
+         mdbuf);
+       if (!deltas) {
+         // This should be impossible, we did check the crc on the mdbuf
+         logger().error(
+           "Journal::replay_segment unable to decode deltas for record {}",
+           base);
+         assert(deltas);
        }
+
+       return seastar::do_with(
+         std::move(*deltas),
+         [=](auto &deltas) {
+           return crimson::do_for_each(
+             deltas,
+             [=](auto &delta) {
+               /* The journal may validly contain deltas for extents in
+                * since released segments.  We can detect those cases by
+                * whether the segment in question currently has a sequence
+                * number > the current journal segment seq. We can safely
+                * skip these deltas because the extent must already have
+                * been rewritten.
+                *
+                * Note, this comparison exploits the fact that
+                * SEGMENT_SEQ_NULL is a large number.
+                */
+               if (delta.paddr != P_ADDR_NULL &&
+                   (segment_provider->get_seq(delta.paddr.segment) >
+                    seq.segment_seq)) {
+                 return replay_ertr::now();
+               } else {
+                 return handler(
+                   journal_seq_t{seq.segment_seq, base},
+                   base.add_offset(header.mdlength),
+                   delta);
+               }
+             });
+         });
       }),
-    [=](auto &dhandler) {
-      return scan_segment(
-       seq.offset,
-       segment_manager.get_segment_size(),
+    [=](auto &cursor, auto &dhandler) {
+      return scan_valid_records(
+       cursor,
        header.segment_nonce,
-       &dhandler,
-       nullptr).safe_then([](auto){});
+       std::numeric_limits<size_t>::max(),
+       dhandler).safe_then([](auto){});
     });
 }