From c300ec9630abd7bee2fb530dd5364ced6aa9de80 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 17 Sep 2020 15:45:56 -0700 Subject: [PATCH] os/seastore/journal: replay_segment: skip replay on deltas to released segments See comment. Signed-off-by: Samuel Just --- src/crimson/os/seastore/journal.cc | 24 +++++++++++++++++++----- src/crimson/os/seastore/journal.h | 2 ++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 95aad57d67f..7b228445a32 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -398,11 +398,25 @@ Journal::replay_segment( logger().debug("replay_segment: starting at {}", seq); return seastar::do_with( delta_scan_handler_t( - [&handler, seq](auto addr, auto base, const auto &delta) { - return handler( - journal_seq_t{seq.segment_seq, addr}, - base, - delta); + [=, &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); + } }), [this, seq](auto &dhandler) { return scan_segment( diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index 805d1f408bc..5ca090ac4ee 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -102,6 +102,8 @@ public: virtual void init_mark_segment_closed( segment_id_t segment, segment_seq_t seq) {} + virtual segment_seq_t get_seq(segment_id_t id) { return 0; } + virtual ~JournalSegmentProvider() {} }; -- 2.47.3