From: Adam C. Emerson Date: Tue, 19 Dec 2017 21:47:09 +0000 (-0500) Subject: rgw: Add expiration in the object cache X-Git-Tag: v13.0.2~675^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=82a7e6ca31b416a7f0e41b5fda4c403d1d6be947;p=ceph.git rgw: Add expiration in the object cache We had it in the chained caches, but it doesn't do much good if they just fetch objects out of the object cache. Fixes: http://tracker.ceph.com/issues/22517 Signed-off-by: Adam C. Emerson --- diff --git a/src/rgw/rgw_cache.cc b/src/rgw/rgw_cache.cc index 3606b85ca4c..43c03ec5ecf 100644 --- a/src/rgw/rgw_cache.cc +++ b/src/rgw/rgw_cache.cc @@ -17,9 +17,12 @@ int ObjectCache::get(string& name, ObjectCacheInfo& info, uint32_t mask, rgw_cac } auto iter = cache_map.find(name); - if (iter == cache_map.end()) { + if (iter == cache_map.end() || + (expiry.count() && + (ceph::coarse_mono_clock::now() - iter->second.info.time_added) > expiry)) { ldout(cct, 10) << "cache get: name=" << name << " : miss" << dendl; - if(perfcounter) perfcounter->inc(l_rgw_cache_miss); + if (perfcounter) + perfcounter->inc(l_rgw_cache_miss); return -ENOENT; } diff --git a/src/rgw/rgw_cache.h b/src/rgw/rgw_cache.h index 8e4e4fc6427..faabc0cda2f 100644 --- a/src/rgw/rgw_cache.h +++ b/src/rgw/rgw_cache.h @@ -50,16 +50,17 @@ struct ObjectMetaInfo { WRITE_CLASS_ENCODER(ObjectMetaInfo) struct ObjectCacheInfo { - int status; - uint32_t flags; - uint64_t epoch; + int status = 0; + uint32_t flags = 0; + uint64_t epoch = 0; bufferlist data; map xattrs; map rm_xattrs; ObjectMetaInfo meta; - obj_version version; + obj_version version = {}; + ceph::coarse_mono_time time_added = ceph::coarse_mono_clock::now(); - ObjectCacheInfo() : status(0), flags(0), epoch(0), version() {} + ObjectCacheInfo() = default; void encode(bufferlist& bl) const { ENCODE_START(5, 3, bl); @@ -147,6 +148,7 @@ class ObjectCache { vector chained_cache; bool enabled; + ceph::timespan expiry; void touch_lru(string& name, ObjectCacheEntry& entry, std::deque::iterator& lru_iter); @@ -162,6 +164,8 @@ public: void set_ctx(CephContext *_cct) { cct = _cct; lru_window = cct->_conf->rgw_cache_lru_size / 2; + expiry = std::chrono::seconds(cct->_conf->get_val( + "rgw_cache_expiry_interval")); } bool chain_cache_entry(std::initializer_list cache_info_entries, RGWChainedCache::Entry *chained_entry);