From 6933f4c9980a9db2025f625d64ee4d81868e2728 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 31 Jul 2024 16:51:31 +0800 Subject: [PATCH] crimson/os/seastore/cache: verify pending extents in get_extent_viewable_by_trans() Distinguish specific cases carefully. Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.h | 39 ++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 14331f4e87692..779df4f6f524b 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 ... -- {}", -- 2.39.5