From 45e78bbeb2d6ff010c15e02939b6b5d70a22c40b Mon Sep 17 00:00:00 2001 From: Mark Kogan Date: Tue, 12 Dec 2017 10:34:05 -0500 Subject: [PATCH] rgw: fix chained cache invalidation to prevent cache size growth above the rgw_cache_lru_size limit Signed-off-by: Mark Kogan --- src/rgw/rgw_cache.cc | 20 ++++++++++++++------ src/rgw/rgw_cache.h | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_cache.cc b/src/rgw/rgw_cache.cc index be941e139576c8..67c8d834aba18b 100644 --- a/src/rgw/rgw_cache.cc +++ b/src/rgw/rgw_cache.cc @@ -135,11 +135,7 @@ void ObjectCache::put(string& name, ObjectCacheInfo& info, rgw_cache_entry_info ObjectCacheEntry& entry = iter->second; ObjectCacheInfo& target = entry.info; - for (list >::iterator iiter = entry.chained_entries.begin(); - iiter != entry.chained_entries.end(); ++iiter) { - RGWChainedCache *chained_cache = iiter->first; - chained_cache->invalidate(iiter->second); - } + invalidate_lru(entry); entry.chained_entries.clear(); entry.gen++; @@ -230,8 +226,11 @@ void ObjectCache::touch_lru(string& name, ObjectCacheEntry& entry, std::list::iterator map_iter = cache_map.find(*iter); ldout(cct, 10) << "removing entry: name=" << *iter << " from cache LRU" << dendl; - if (map_iter != cache_map.end()) + if (map_iter != cache_map.end()) { + ObjectCacheEntry& entry = map_iter->second; + invalidate_lru(entry); cache_map.erase(map_iter); + } lru.pop_front(); lru_size--; } @@ -263,6 +262,15 @@ void ObjectCache::remove_lru(string& name, std::list::iterator& lru_iter lru_iter = lru.end(); } +void ObjectCache::invalidate_lru(ObjectCacheEntry& entry) +{ + for (list >::iterator iter = entry.chained_entries.begin(); + iter != entry.chained_entries.end(); ++iter) { + RGWChainedCache *chained_cache = iter->first; + chained_cache->invalidate(iter->second); + } +} + void ObjectCache::set_enabled(bool status) { RWLock::WLocker l(lock); diff --git a/src/rgw/rgw_cache.h b/src/rgw/rgw_cache.h index 215f1445abfec4..4c7c1adac37ff6 100644 --- a/src/rgw/rgw_cache.h +++ b/src/rgw/rgw_cache.h @@ -149,6 +149,7 @@ class ObjectCache { void touch_lru(string& name, ObjectCacheEntry& entry, std::list::iterator& lru_iter); void remove_lru(string& name, std::list::iterator& lru_iter); + void invalidate_lru(ObjectCacheEntry& entry); void do_invalidate_all(); public: