From b922fa8905c10c9e70232f43061315b08026c7b3 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 20 Nov 2020 19:09:54 -0800 Subject: [PATCH] crimson/os/seastore/journal: replace scan_segment with scan_valid_records in replay_segment Signed-off-by: Samuel Just --- src/crimson/os/seastore/journal.cc | 73 ++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 6dc9b230385..a7ccb55c847 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -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::max(), + dhandler).safe_then([](auto){}); }); } -- 2.39.5