From 88ca65776bd7248152b55360d4621107ce0caeb9 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Thu, 14 Sep 2023 15:50:20 +0800 Subject: [PATCH] crimson/os/seastore/cache: don't add EXIST_CLEAN extents to lru Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cache.h | 9 ++++++--- src/crimson/os/seastore/cached_extent.h | 7 +++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 1820d758a0ba7..c8234ff428046 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -467,7 +467,8 @@ public: ret->cast()); }); } else { - touch_extent(*ret); + assert(!ret->is_mutable()); + touch_extent(*ret); SUBDEBUGT(seastore_cache, "{} {}~{} is present on t without been \ fully loaded, reading ... {}", t, T::TYPE, offset, length, *ret); auto bp = alloc_cache_buf(ret->get_length()); @@ -566,6 +567,7 @@ public: // 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, @@ -661,7 +663,8 @@ private: return seastar::make_ready_future(ret); }); } else { - touch_extent(*ret); + assert(!ret->is_mutable()); + touch_extent(*ret); SUBDEBUGT(seastore_cache, "{} {}~{} {} is present on t without been \ fully loaded, reading ...", t, type, offset, length, laddr); auto bp = alloc_cache_buf(ret->get_length()); @@ -1281,7 +1284,7 @@ public: { if (p_src && is_background_transaction(*p_src)) return; - if (ext.is_clean() && !ext.is_placeholder()) { + if (ext.is_stable_clean() && !ext.is_placeholder()) { lru.move_to_top(ext); } } diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index 497d7dcfcdc53..ebe6dee62a2a8 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -442,6 +442,13 @@ public: state == extent_state_t::EXIST_CLEAN; } + // Returs true if extent is stable and clean + bool is_stable_clean() const { + ceph_assert(is_valid()); + return state == extent_state_t::CLEAN || + state == extent_state_t::CLEAN_PENDING; + } + /// Ruturns true if data is persisted while metadata isn't bool is_exist_clean() const { return state == extent_state_t::EXIST_CLEAN; -- 2.39.5