]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: remove expired entries from the cache 22930/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:22:15 +0000 (10:22 +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 c60d72953665ba9a1f221719485ef86fbe9cecdf..e465e4d88e242a4d3b74178bc47fed8563f2d464 100644 (file)
@@ -18,14 +18,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;