From 67a9109ca95d2735ba5247c812fc497e47a1a67e Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 24 Aug 2022 10:51:56 +0800 Subject: [PATCH] crimson/os/seastore/cache: workaround to drop delta with mismatched crc The workaround is unreliable to identify whether the delta is out-dated, need to drop it once the paddr->journal_seq_t mapping is introduced. Note: this issue only happens with journal_type_t::CIRCULAR. Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/async_cleaner.h | 4 ++++ src/crimson/os/seastore/cache.cc | 13 +++++++++++-- src/crimson/os/seastore/extent_placement_manager.h | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/crimson/os/seastore/async_cleaner.h b/src/crimson/os/seastore/async_cleaner.h index 1cc231ae2d8..b431cb11897 100644 --- a/src/crimson/os/seastore/async_cleaner.h +++ b/src/crimson/os/seastore/async_cleaner.h @@ -840,6 +840,10 @@ public: return *ool_segment_seq_allocator; } + journal_type_t get_journal_type() const { + return journal_type; + } + void set_extent_callback(ExtentCallbackInterface *cb) { ecb = cb; } diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index beab454ee9d..8bed316a2d5 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1757,9 +1757,18 @@ Cache::replay_delta( DEBUG("replay extent delta at {} {} ... -- {}, prv_extent={}", journal_seq, record_base, delta, *extent); - assert(extent->version == delta.pversion); + if (extent->last_committed_crc != delta.prev_crc) { + // FIXME: we can't rely on crc to detect whether is delta is + // out-of-date. + ERROR("identified delta crc {} doesn't match the extent at {} {}, " + "probably is out-dated -- {}", + delta, journal_seq, record_base, *extent); + ceph_assert(epm.get_journal_type() == journal_type_t::CIRCULAR); + remove_extent(extent); + return replay_delta_ertr::make_ready_future(false); + } - 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); diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index d5b39854c15..60b3e2476db 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -98,6 +98,10 @@ public: cleaner->set_extent_callback(cb); } + journal_type_t get_journal_type() const { + return cleaner->get_journal_type(); + } + seastore_off_t get_block_size() const { assert(primary_device != nullptr); // assume all the devices have the same block size -- 2.39.5