using namespace std;
-int ObjectCache::get(string& name, ObjectCacheInfo& info, uint32_t mask, rgw_cache_entry_info *cache_info)
+int ObjectCache::get(const string& name, ObjectCacheInfo& info, uint32_t mask, rgw_cache_entry_info *cache_info)
{
RWLock::RLocker l(lock);
return true;
}
-void ObjectCache::put(string& name, ObjectCacheInfo& info, rgw_cache_entry_info *cache_info)
+void ObjectCache::put(const string& name, ObjectCacheInfo& info, rgw_cache_entry_info *cache_info)
{
RWLock::WLocker l(lock);
ldout(cct, 10) << "cache put: name=" << name << " info.flags=0x"
<< std::hex << info.flags << std::dec << dendl;
- map<string, ObjectCacheEntry>::iterator iter = cache_map.find(name);
- if (iter == cache_map.end()) {
- ObjectCacheEntry entry;
+
+ const std::pair<std::map<std::string,
+ ObjectCacheEntry>::iterator, bool>& emp_pair
+ = cache_map.emplace(name, ObjectCacheEntry{});
+ ObjectCacheEntry& entry = emp_pair.first->second;
+ bool inserted = emp_pair.second;
+ entry.info.time_added = ceph::coarse_mono_clock::now();
+ if (inserted) {
entry.lru_iter = lru.end();
- cache_map.insert(pair<string, ObjectCacheEntry>(name, entry));
- iter = cache_map.find(name);
}
- ObjectCacheEntry& entry = iter->second;
ObjectCacheInfo& target = entry.info;
invalidate_lru(entry);
target.version = info.version;
}
-void ObjectCache::remove(string& name)
+bool ObjectCache::remove(const string& name)
{
RWLock::WLocker l(lock);
if (!enabled) {
- return;
+ return false;
}
map<string, ObjectCacheEntry>::iterator iter = cache_map.find(name);
if (iter == cache_map.end())
- return;
+ return false;
ldout(cct, 10) << "removing " << name << " from cache" << dendl;
ObjectCacheEntry& entry = iter->second;
remove_lru(name, iter->second.lru_iter);
cache_map.erase(iter);
+ return true;
}
-void ObjectCache::touch_lru(string& name, ObjectCacheEntry& entry, std::list<string>::iterator& lru_iter)
+void ObjectCache::touch_lru(const string& name, ObjectCacheEntry& entry,
+ std::list<string>::iterator& lru_iter)
{
while (lru_size > (size_t)cct->_conf->rgw_cache_lru_size) {
list<string>::iterator iter = lru.begin();
entry.lru_promotion_ts = lru_counter;
}
-void ObjectCache::remove_lru(string& name, std::list<string>::iterator& lru_iter)
+void ObjectCache::remove_lru(const string& name,
+ std::list<string>::iterator& lru_iter)
{
if (lru_iter == lru.end())
return;