]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: replay_delta handle obsolete extents properly
authorSamuel Just <sjust@redhat.com>
Fri, 21 Aug 2020 21:32:55 +0000 (14:32 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 25 Sep 2020 19:41:11 +0000 (12:41 -0700)
If we see a delta at verison v (v != 0) and we haven't seen version v-1,
we know that the extent is obsolete and can be ignored (presuming that
journal trimming is behaving).

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

index 34ed12d4e930af18ad578e844f9b380d1a66b58a..48ff8a36f07b0ec1b2765a27d66e7b3f900a3931 100644 (file)
@@ -319,28 +319,49 @@ Cache::replay_delta(
     root->dirty_from = journal_seq;
     return replay_delta_ertr::now();
   } else {
-    return get_extent_by_type(
-      delta.type,
-      delta.paddr,
-      delta.laddr,
-      delta.length).safe_then([=](auto extent) {
+    auto get_extent_if_cached = [this](paddr_t addr)
+      -> replay_delta_ertr::future<CachedExtentRef> {
+      auto retiter = extents.find_offset(addr);
+      if (retiter != extents.end()) {
+       return replay_delta_ertr::make_ready_future<CachedExtentRef>(&*retiter);
+      } else {
+       return replay_delta_ertr::make_ready_future<CachedExtentRef>();
+      }
+    };
+    auto extent_fut = delta.pversion == 0 ?
+      get_extent_by_type(
+       delta.type,
+       delta.paddr,
+       delta.laddr,
+       delta.length) :
+      get_extent_if_cached(
+       delta.paddr);
+    return extent_fut.safe_then([=, &delta](auto extent) {
+      if (!extent) {
+       assert(delta.pversion > 0);
        logger().debug(
-         "replay_delta: replaying {} on {}",
-         *extent,
+         "replay_delta: replaying {}, extent not present so delta is obsolete",
          delta);
+       return;
+      }
 
-       assert(extent->version == delta.pversion);
+      logger().debug(
+       "replay_delta: replaying {} on {}",
+         *extent,
+       delta);
 
-       assert(extent->last_committed_crc == delta.prev_crc);
-       extent->apply_delta_and_adjust_crc(record_base, delta.bl);
-       assert(extent->last_committed_crc == delta.final_crc);
+      assert(extent->version == delta.pversion);
 
-       if (extent->version == 0) {
-         extent->dirty_from = journal_seq;
-       }
-       extent->version++;
-       mark_dirty(extent);
-      });
+      assert(extent->last_committed_crc == delta.prev_crc);
+      extent->apply_delta_and_adjust_crc(record_base, delta.bl);
+      assert(extent->last_committed_crc == delta.final_crc);
+
+      if (extent->version == 0) {
+       extent->dirty_from = journal_seq;
+      }
+      extent->version++;
+      mark_dirty(extent);
+    });
   }
 }