map<string, bufferlist> *pattrs,
boost::optional<obj_version> refresh_version)
{
- bucket_info_entry e;
string bucket_entry;
rgw_make_bucket_entry_name(tenant, bucket_name, bucket_entry);
- if (binfo_cache->find(bucket_entry, &e)) {
+ if (auto e = binfo_cache->find(bucket_entry)) {
if (refresh_version &&
- e.info.objv_tracker.read_version.compare(&(*refresh_version))) {
+ e->info.objv_tracker.read_version.compare(&(*refresh_version))) {
lderr(cct) << "WARNING: The bucket info cache is inconsistent. This is "
<< "a failure that should be debugged. I am a nice machine, "
<< "so I will try to recover." << dendl;
binfo_cache->invalidate(bucket_entry);
+ } else {
+ info = e->info;
+ if (pattrs)
+ *pattrs = e->attrs;
+ if (pmtime)
+ *pmtime = e->mtime;
+ return 0;
}
- info = e.info;
- if (pattrs)
- *pattrs = e.attrs;
- if (pmtime)
- *pmtime = e.mtime;
- return 0;
}
+ bucket_info_entry e;
RGWBucketEntryPoint entry_point;
real_time ep_mtime;
RGWObjVersionTracker ot;
ceph::timespan expiry;
RWLock lock;
- map<string, std::pair<T, ceph::coarse_mono_time>> entries;
+ std::unordered_map<std::string, std::pair<T, ceph::coarse_mono_time>> entries;
public:
RGWChainedCacheImpl() : lock("RGWChainedCacheImpl::lock") {}
"rgw_bucket_info_cache_expiry_interval"));
}
- bool find(const string& key, T *entry) {
+ boost::optional<T> find(const string& key) {
RWLock::RLocker rl(lock);
auto iter = entries.find(key);
if (iter == entries.end()) {
- return false;
+ return boost::none;
}
if (expiry.count() &&
(ceph::coarse_mono_clock::now() - iter->second.second) > expiry) {
- return false;
+ return boost::none;
}
- *entry = iter->second.first;
- return true;
+ return iter->second.first;
}
bool put(RGWRados *store, const string& key, T *entry, list<rgw_cache_entry_info *>& cache_info_entries) {
RGWObjVersionTracker * const objv_tracker,
real_time * const pmtime)
{
- user_info_entry e;
- if (uinfo_cache.find(key, &e)) {
- info = e.info;
+ if (auto e = uinfo_cache.find(key)) {
+ info = e->info;
if (objv_tracker)
- *objv_tracker = e.objv_tracker;
+ *objv_tracker = e->objv_tracker;
if (pmtime)
- *pmtime = e.mtime;
+ *pmtime = e->mtime;
return 0;
}
+ user_info_entry e;
bufferlist bl;
RGWUID uid;
RGWObjectCtx obj_ctx(store);