From: Samuel Just Date: Thu, 17 Sep 2020 22:45:56 +0000 (-0700) Subject: os/seastore/journal: replay_segment: skip replay on deltas to released segments X-Git-Tag: v16.1.0~807^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c300ec9630abd7bee2fb530dd5364ced6aa9de80;p=ceph.git os/seastore/journal: replay_segment: skip replay on deltas to released segments See comment. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 95aad57d67fe..7b228445a32b 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 805d1f408bc7..5ca090ac4ee8 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() {} };