From 98f6dada873f32be8750bf3e101de4f33ea9b26f Mon Sep 17 00:00:00 2001 From: Mark Kogan Date: Tue, 5 Jun 2018 11:18:30 +0300 Subject: [PATCH] rgw: remove expired entries from the cache Fixes: http://tracker.ceph.com/issues/23379 Signed-off-by: Mark Kogan --- src/rgw/rgw_cache.cc | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_cache.cc b/src/rgw/rgw_cache.cc index 7dc2156b0a5..e4d38b678a0 100644 --- a/src/rgw/rgw_cache.cc +++ b/src/rgw/rgw_cache.cc @@ -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; -- 2.39.5