]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/seastore/journal: replay_segment: skip replay on deltas to released segments
authorSamuel Just <sjust@redhat.com>
Thu, 17 Sep 2020 22:45:56 +0000 (15:45 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:08 +0000 (12:27 -0700)
See comment.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h

index 95aad57d67fe468b38b41647def1a07ff4c88fc4..7b228445a32bedfbad49348ab3621cc1d0b7a97f 100644 (file)
@@ -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(
index 805d1f408bc76221ce7e481e8c6fa2bb032c2d34..5ca090ac4ee8deb04232770228eb64751195113e 100644 (file)
@@ -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() {}
 };