]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache/LRU: account the empty extent when adding it to LRU 63225/head
authorZhang Song <zhangsong02@qianxin.com>
Fri, 25 Apr 2025 08:55:34 +0000 (16:55 +0800)
committerMatan Breizman <mbreizma@redhat.com>
Mon, 12 May 2025 08:08:27 +0000 (08:08 +0000)
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 <zhangsong02@qianxin.com>
(cherry picked from commit ee388c3e4268a55bb1f9ddfba08321ff0fb4f4fe)

src/crimson/os/seastore/cache.h
src/crimson/os/seastore/seastore_types.h

index fb728f529ef53116daeaf989f8702217e591cb9d..0fe530c80d26dedbf367265e05ab9afff687b80e 100644 (file)
@@ -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(
index a60c265d96f07787419cbe71df0923f227f47437..ff2c8172f8c5acb3f0beed40215dc91b07c7cbd8 100644 (file)
@@ -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);