From: Samuel Just Date: Thu, 24 Jun 2021 22:24:09 +0000 (-0700) Subject: crimson/os/seastore/cache: mark conflict in get_extent X-Git-Tag: v17.1.0~1563^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2bc257beb2ef1253e38c254745f42b3ac5db52de;p=ceph.git 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 --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index df5ca6270f30..159b33395c2e 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)); + } }); } }