]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Add expiration in the object cache
authorAdam C. Emerson <aemerson@redhat.com>
Tue, 19 Dec 2017 21:47:09 +0000 (16:47 -0500)
committerAdam C. Emerson <aemerson@redhat.com>
Fri, 5 Jan 2018 16:11:56 +0000 (11:11 -0500)
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 <aemerson@redhat.com>
(cherry picked from commit 82a7e6ca31b416a7f0e41b5fda4c403d1d6be947)

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

index 31aff871165a64d959a33961656a92bd705bbb40..e9b12875be1e690c4c6f79ca79721e8637116dca 100644 (file)
@@ -17,10 +17,13 @@ int ObjectCache::get(string& name, ObjectCacheInfo& info, uint32_t mask, rgw_cac
     return -ENOENT;
   }
 
-  map<string, ObjectCacheEntry>::iterator iter = cache_map.find(name);
-  if (iter == cache_map.end()) {
+  auto iter = cache_map.find(name);
+  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;
   }
 
index 6bc9ef14903268f213440599af8d596aea5bd9e1..1c03c2710609d5ccd71d8ef6f2270755592e57cc 100644 (file)
@@ -49,16 +49,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<string, bufferlist> xattrs;
   map<string, bufferlist> 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);
@@ -146,6 +147,7 @@ class ObjectCache {
   list<RGWChainedCache *> chained_cache;
 
   bool enabled;
+  ceph::timespan expiry;
 
   void touch_lru(string& name, ObjectCacheEntry& entry, std::list<string>::iterator& lru_iter);
   void remove_lru(string& name, std::list<string>::iterator& lru_iter);
@@ -159,6 +161,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<uint64_t>(
+                                               "rgw_cache_expiry_interval"));
   }
   bool chain_cache_entry(list<rgw_cache_entry_info *>& cache_info_entries, RGWChainedCache::Entry *chained_entry);