From: Yingxin Cheng Date: Wed, 31 Jul 2024 08:51:31 +0000 (+0800) Subject: crimson/os/seastore/cache: verify pending extents in get_extent_viewable_by_trans() X-Git-Tag: testing/wip-pdonnell-testing-20240813.125846-debug~36^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6933f4c9980a9db2025f625d64ee4d81868e2728;p=ceph-ci.git crimson/os/seastore/cache: verify pending extents in get_extent_viewable_by_trans() Distinguish specific cases carefully. Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 14331f4e876..779df4f6f52 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -476,16 +476,45 @@ public: CachedExtentRef extent) { assert(extent->is_valid()); - auto p_extent = extent->get_transactional_view(t); - if (!p_extent->is_pending_in_trans(t.get_trans_id())) { - t.add_to_read_set(p_extent); - touch_extent(*p_extent); + CachedExtent* p_extent; + if (extent->is_stable()) { + p_extent = extent->get_transactional_view(t); + if (p_extent != extent.get()) { + assert(!extent->is_stable_writting()); + assert(p_extent->is_pending_in_trans(t.get_trans_id())); + assert(!p_extent->is_stable_writting()); + if (p_extent->is_mutable()) { + assert(p_extent->is_fully_loaded()); + assert(!p_extent->is_pending_io()); + return get_extent_ertr::make_ready_future( + CachedExtentRef(p_extent)); + } else { + assert(p_extent->is_exist_clean()); + } + } else { + // stable from trans-view + assert(!p_extent->is_pending_in_trans(t.get_trans_id())); + t.add_to_read_set(p_extent); + touch_extent(*p_extent); + } + } else { + assert(!extent->is_stable_writting()); + assert(extent->is_pending_in_trans(t.get_trans_id())); + if (extent->is_mutable()) { + assert(extent->is_fully_loaded()); + assert(!extent->is_pending_io()); + return get_extent_ertr::make_ready_future(extent); + } else { + assert(extent->is_exist_clean()); + p_extent = extent.get(); + } } + + assert(p_extent->is_stable() || p_extent->is_exist_clean()); // user should not see RETIRED_PLACEHOLDER extents ceph_assert(p_extent->get_type() != extent_types_t::RETIRED_PLACEHOLDER); if (!p_extent->is_fully_loaded()) { assert(!p_extent->is_mutable()); - touch_extent(*p_extent); LOG_PREFIX(Cache::get_extent_viewable_by_trans); SUBDEBUG(seastore_cache, "{} {}~{} is present without been fully loaded, reading ... -- {}",