From: Or Friedmann Date: Wed, 24 Jun 2020 12:55:20 +0000 (+0300) Subject: rgw: add negative cache to the system object X-Git-Tag: v16.1.0~1708^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0900bd8cf90babd6fafcb398854a4ddb071a27ee;p=ceph.git rgw: add negative cache to the system object add negative cache to the system object Signed-off-by: Or Friedmann Fixes: https://tracker.ceph.com/issues/45816 --- diff --git a/src/rgw/rgw_cache.cc b/src/rgw/rgw_cache.cc index 41dd004c10f89..90a608d1bf159 100644 --- a/src/rgw/rgw_cache.cc +++ b/src/rgw/rgw_cache.cc @@ -67,6 +67,11 @@ int ObjectCache::get(const string& name, ObjectCacheInfo& info, uint32_t mask, r } ObjectCacheInfo& src = iter->second.info; + if(src.status == -ENOENT) { + ldout(cct, 10) << "cache get: name=" << name << " : hit (negative entry)" << dendl; + if (perfcounter) perfcounter->inc(l_rgw_cache_hit); + return -ENODATA; + } if ((src.flags & mask) != mask) { ldout(cct, 10) << "cache get: name=" << name << " : type miss (requested=0x" << std::hex << mask << ", cached=0x" << src.flags diff --git a/src/rgw/services/svc_sys_obj_cache.cc b/src/rgw/services/svc_sys_obj_cache.cc index 8df76c85b5924..04a958cd051a8 100644 --- a/src/rgw/services/svc_sys_obj_cache.cc +++ b/src/rgw/services/svc_sys_obj_cache.cc @@ -132,8 +132,9 @@ int RGWSI_SysObj_Cache::read(RGWSysObjectCtxBase& obj_ctx, flags |= CACHE_FLAG_OBJV; if (attrs) flags |= CACHE_FLAG_XATTRS; - - if ((cache.get(name, info, flags, cache_info) == 0) && + + int r = cache.get(name, info, flags, cache_info); + if (r == 0 && (!refresh_version || !info.version.compare(&(*refresh_version)))) { if (info.status < 0) return info.status; @@ -156,9 +157,11 @@ int RGWSI_SysObj_Cache::read(RGWSysObjectCtxBase& obj_ctx, } return obl->length(); } + if(r == -ENODATA) + return -ENOENT; map unfiltered_attrset; - int r = RGWSI_SysObj_Core::read(obj_ctx, read_state, objv_tracker, + r = RGWSI_SysObj_Core::read(obj_ctx, read_state, objv_tracker, obj, obl, ofs, end, (attrs ? &unfiltered_attrset : nullptr), true, /* cache unfiltered attrs */ @@ -215,7 +218,8 @@ int RGWSI_SysObj_Cache::get_attr(const rgw_raw_obj& obj, uint32_t flags = CACHE_FLAG_XATTRS; - if (cache.get(name, info, flags, nullptr) == 0) { + int r = cache.get(name, info, flags, nullptr); + if (r == 0) { if (info.status < 0) return info.status; @@ -226,6 +230,8 @@ int RGWSI_SysObj_Cache::get_attr(const rgw_raw_obj& obj, *dest = iter->second; return dest->length(); + } else if (r == -ENODATA) { + return -ENOENT; } /* don't try to cache this one */ return RGWSI_SysObj_Core::get_attr(obj, attr_name, dest, y); @@ -382,6 +388,9 @@ int RGWSI_SysObj_Cache::raw_stat(const rgw_raw_obj& obj, uint64_t *psize, real_t objv_tracker->read_version = info.version; goto done; } + if (r == -ENODATA) { + return -ENOENT; + } r = RGWSI_SysObj_Core::raw_stat(obj, &size, &mtime, &epoch, &info.xattrs, first_chunk, objv_tracker, y); if (r < 0) {