}
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
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;
}
return obl->length();
}
+ if(r == -ENODATA)
+ return -ENOENT;
map<string, bufferlist> 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 */
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;
*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);
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) {