From fba0d40900a1f6cf0dc1f4e0524f36fdb01699f2 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Fri, 25 Apr 2025 16:55:34 +0800 Subject: [PATCH] crimson/os/seastore/cache/LRU: account the empty extent when adding it to LRU Don't update num_extents when a partial extent is already in LRU. Fixes: https://tracker.ceph.com/issues/69986 Signed-off-by: Zhang Song (cherry picked from commit ee388c3e4268a55bb1f9ddfba08321ff0fb4f4fe) --- src/crimson/os/seastore/cache.h | 4 ++-- src/crimson/os/seastore/seastore_types.h | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index fb728f529ef53..0fe530c80d26d 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -1641,7 +1641,6 @@ private: // absent, add to top (back) if (extent_loaded_length > 0) { current_size += extent_loaded_length; - get_by_ext(sizes_by_ext, extent.get_type()).account_in(extent_loaded_length); overall_io.in_sizes.account_in(extent_loaded_length); if (p_src) { get_by_ext( @@ -1651,6 +1650,7 @@ private: } } // else: the extent isn't loaded upon touch_extent()/on_cache(), // account the io later in increase_cached_size() upon read_extent() + get_by_ext(sizes_by_ext, extent.get_type()).account_in(extent_loaded_length); intrusive_ptr_add_ref(&extent); lru.push_back(extent); @@ -1669,7 +1669,7 @@ private: // present, increase size assert(lru.size() > 0); current_size += increased_length; - get_by_ext(sizes_by_ext, extent.get_type()).account_in(increased_length); + get_by_ext(sizes_by_ext, extent.get_type()).account_parital_in(increased_length); overall_io.in_sizes.account_in(increased_length); if (p_src) { get_by_ext( diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index a60c265d96f07..ff2c8172f8c5a 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -2874,6 +2874,10 @@ struct cache_size_stats_t { ++num_extents; } + void account_parital_in(extent_len_t sz) { + size += sz; + } + void account_out(extent_len_t sz) { assert(size >= sz); assert(num_extents > 0); -- 2.39.5