]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix chained cache invalidation to prevent cache size growth 19785/head
authorMark Kogan <mkogan@redhat.com>
Tue, 12 Dec 2017 15:34:05 +0000 (10:34 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Thu, 4 Jan 2018 21:03:45 +0000 (16:03 -0500)
above the rgw_cache_lru_size limit

Fixes: http://tracker.ceph.com/issues/22410
Signed-off-by: Mark Kogan <mkogan@redhat.com>
(cherry picked from commit a6a1b664d313a54ad9d2f64b859296b1352b1ce4)

src/rgw/rgw_cache.cc
src/rgw/rgw_cache.h

index 31aff871165a64d959a33961656a92bd705bbb40..7f93d30c36fe690c868d32d96f13b24976cb9a19 100644 (file)
@@ -136,11 +136,7 @@ void ObjectCache::put(string& name, ObjectCacheInfo& info, rgw_cache_entry_info
   ObjectCacheEntry& entry = iter->second;
   ObjectCacheInfo& target = entry.info;
 
-  for (list<pair<RGWChainedCache *, string> >::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++;
@@ -231,8 +227,11 @@ void ObjectCache::touch_lru(string& name, ObjectCacheEntry& entry, std::list<str
     }
     map<string, ObjectCacheEntry>::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--;
   }
@@ -264,6 +263,15 @@ void ObjectCache::remove_lru(string& name, std::list<string>::iterator& lru_iter
   lru_iter = lru.end();
 }
 
+void ObjectCache::invalidate_lru(ObjectCacheEntry& entry)
+{
+  for (list<pair<RGWChainedCache *, string> >::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);
index 6bc9ef14903268f213440599af8d596aea5bd9e1..8a5b10b861179fbeaa2a56b436843fbd96c2b905 100644 (file)
@@ -149,6 +149,7 @@ class ObjectCache {
 
   void touch_lru(string& name, ObjectCacheEntry& entry, std::list<string>::iterator& lru_iter);
   void remove_lru(string& name, std::list<string>::iterator& lru_iter);
+  void invalidate_lru(ObjectCacheEntry& entry);
 
   void do_invalidate_all();
 public: