From 5d4b43ad260db8d9cceeaae87583d81821ac8cfa Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 21 Aug 2020 14:32:55 -0700 Subject: [PATCH] crimson/os/seastore/cache: replay_delta handle obsolete extents properly 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 --- src/crimson/os/seastore/cache.cc | 55 ++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 34ed12d4e93..48ff8a36f07 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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 { + auto retiter = extents.find_offset(addr); + if (retiter != extents.end()) { + return replay_delta_ertr::make_ready_future(&*retiter); + } else { + return replay_delta_ertr::make_ready_future(); + } + }; + 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); + }); } } -- 2.39.5