]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: remove expired entries from the cache 22929/head
authorMark Kogan <mkogan@redhat.com>
Tue, 5 Jun 2018 08:18:30 +0000 (11:18 +0300)
committerNathan Cutler <ncutler@suse.com>
Sat, 7 Jul 2018 08:21:14 +0000 (10:21 +0200)
Fixes: http://tracker.ceph.com/issues/23379
Signed-off-by: Mark Kogan <mkogan@redhat.com>
(cherry picked from commit 98f6dada873f32be8750bf3e101de4f33ea9b26f)

src/rgw/rgw_cache.cc

index b43d5e5c9f73d25e05c3288c384b6cce78087e84..810d82a3bc9989c3791fa2ffa6f67e15d3e4f731 100644 (file)
@@ -17,14 +17,29 @@ int ObjectCache::get(const string& name, ObjectCacheInfo& info, uint32_t mask, r
   }
 
   auto iter = cache_map.find(name);
-  if (iter == cache_map.end() ||
-      (expiry.count() &&
-       (ceph::coarse_mono_clock::now() - iter->second.info.time_added) > expiry)) {
+  if (iter == cache_map.end()) {
     ldout(cct, 10) << "cache get: name=" << name << " : miss" << dendl;
     if (perfcounter)
       perfcounter->inc(l_rgw_cache_miss);
     return -ENOENT;
   }
+  if (expiry.count() &&
+       (ceph::coarse_mono_clock::now() - iter->second.info.time_added) > expiry) {
+    ldout(cct, 10) << "cache get: name=" << name << " : expiry miss" << dendl;
+    lock.unlock();
+    lock.get_write();
+    // check that wasn't already removed by other thread
+    iter = cache_map.find(name);
+    if (iter != cache_map.end()) {
+      for (auto &kv : iter->second.chained_entries)
+        kv.first->invalidate(kv.second);
+      remove_lru(name, iter->second.lru_iter);
+      cache_map.erase(iter);
+    }
+    if(perfcounter)
+      perfcounter->inc(l_rgw_cache_miss);
+    return -ENOENT;
+  }
 
   ObjectCacheEntry *entry = &iter->second;