]> git.apps.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>
Thu, 21 Dec 2017 20:47:24 +0000 (15:47 -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>
src/rgw/rgw_cache.cc
src/rgw/rgw_cache.h

index 3606b85ca4c572f1821f45f6ea13f1c9bceee364..43c03ec5ecfca1050caba8342db096a3f2372cf6 100644 (file)
@@ -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;
   }
 
index 8e4e4fc6427cac902989c67c4b7ca39103c87d79..faabc0cda2fd4ebbe8446ff0acd20188e943c823 100644 (file)
@@ -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<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);
@@ -147,6 +148,7 @@ class ObjectCache {
   vector<RGWChainedCache *> chained_cache;
 
   bool enabled;
+  ceph::timespan expiry;
 
   void touch_lru(string& name, ObjectCacheEntry& entry,
                 std::deque<string>::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<uint64_t>(
+                                               "rgw_cache_expiry_interval"));
   }
   bool chain_cache_entry(std::initializer_list<rgw_cache_entry_info*> cache_info_entries,
                         RGWChainedCache::Entry *chained_entry);