From 2bc257beb2ef1253e38c254745f42b3ac5db52de Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 24 Jun 2021 15:24:09 -0700 Subject: [PATCH] crimson/os/seastore/cache: mark conflict in get_extent After wait_io, the extent may have been mutated again, so it may be invalid. Check in the caller and mark the transaction conflicted as needed. Signed-off-by: Samuel Just --- src/crimson/os/seastore/cache.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index df5ca6270f3..159b33395c2 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -181,7 +181,7 @@ public: auto ret = TCachedExtentRef(static_cast(&*iter)); return ret->wait_io( ).then([ret=std::move(ret)]() mutable -> get_extent_ret { - assert(ret->is_valid()); + // ret may be invalid, caller must check return get_extent_ret( get_extent_ertr::ready_future_marker{}, std::move(ret)); @@ -267,9 +267,14 @@ public: get_extent(offset, length) ).si_then( [&t](auto ref) mutable { - t.add_to_read_set(ref); - return get_extent_iertr::make_ready_future>( - std::move(ref)); + if (!ref->is_valid()) { + t.conflicted = true; + return get_extent_iertr::make_ready_future>(); + } else { + t.add_to_read_set(ref); + return get_extent_iertr::make_ready_future>( + std::move(ref)); + } }); } } -- 2.47.3