]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: replay inplace-rewritten extents correctly at mount time
authorMyoungwon Oh <myoungwon.oh@samsung.com>
Thu, 16 Nov 2023 12:10:55 +0000 (21:10 +0900)
committerMyoungwon Oh <myoungwon.oh@samsung.com>
Thu, 28 Dec 2023 06:25:01 +0000 (15:25 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/cache.cc

index f0c7a0a34f24214ba3c5b8917f694e80d641dbf0..8645a3071062f66ef899ea747a8627522cb902f7 100644 (file)
@@ -1824,11 +1824,23 @@ Cache::replay_delta(
       DEBUG("replay extent delta at {} {} ... -- {}, prv_extent={}",
             journal_seq, record_base, delta, *extent);
 
-      assert(extent->last_committed_crc == delta.prev_crc);
-      assert(extent->version == delta.pversion);
-      extent->apply_delta_and_adjust_crc(record_base, delta.bl);
-      extent->set_modify_time(modify_time);
-      assert(extent->last_committed_crc == delta.final_crc);
+      if (delta.paddr.get_addr_type() == paddr_types_t::SEGMENT ||
+         !can_inplace_rewrite(delta.type)) {
+       assert(extent->last_committed_crc == delta.prev_crc);
+       assert(extent->version == delta.pversion);
+       extent->apply_delta_and_adjust_crc(record_base, delta.bl);
+       extent->set_modify_time(modify_time);
+       assert(extent->last_committed_crc == delta.final_crc);
+      } else {
+       assert(delta.paddr.get_addr_type() == paddr_types_t::RANDOM_BLOCK);
+       extent->apply_delta_and_adjust_crc(record_base, delta.bl);
+       extent->set_modify_time(modify_time);
+       // Since rewrite_dirty can conflict with other transaction after 
+       // inplace rewrite is complete, crc may not be matched
+       if (delta.final_crc == extent->last_committed_crc) {
+         assert(extent->version == delta.pversion);
+       }
+      }
 
       extent->version++;
       if (extent->version == 1) {