assert(OBJ_CACHE_PROMOTED == m_policy->get_status(cache_file_name));
delete read_buf;
- return ret;
evict_objects();
+
+ return ret;
}
int ObjectCacheStore::lookup_object(std::string pool_name,
Context* on_finish) {
ldout(m_cct, 20) << "object name = " << object_name << dendl;
- auto ctx = new FunctionContext([on_finish](int ret) {
- on_finish->complete(ret);
- });
-
- librados::AioCompletion* read_completion = create_rados_callback(ctx);
+ librados::AioCompletion* read_completion = create_rados_callback(on_finish);
// issue a zero-sized read req to get full obj
int ret = ioctx->aio_read(object_name, read_completion, read_buf, 0, 0);
if(ret < 0) {
//TODO(): need a better way to get file path
+ if (cache_file == "") {
+ return 0;
+ }
+
std::string cache_dir = m_cache_root_dir;
if (m_dir_num > 0) {
int ret = std::remove(cache_file_path.c_str());
// evict entry in policy
if (ret == 0) {
+ m_policy->update_status(cache_file, OBJ_CACHE_SKIP);
m_policy->evict_entry(cache_file);
}
cache_status_t SimplePolicy::alloc_entry(std::string file_name) {
ldout(cct, 20) << "alloc entry for: " << file_name << dendl;
+ RWLock::WLocker wlocker(m_cache_map_lock);
+
+ // cache hit when promoting
+ if (m_cache_map.find(file_name) != m_cache_map.end()) {
+ ldout(cct, 20) << "object is under promoting: " << file_name << dendl;
+ return OBJ_CACHE_SKIP;
+ }
m_free_list_lock.lock();
- //TODO(): make the max inflight ops configurable
- if (m_free_list.size() && (inflight_ops < 128)) {
+ if (m_free_list.size() && (inflight_ops < m_max_inflight_ops)) {
Entry* entry = m_free_list.front();
ceph_assert(entry != nullptr);
m_free_list.pop_front();
m_free_list_lock.unlock();
-
- {
- RWLock::WLocker wlocker(m_cache_map_lock);
- m_cache_map[file_name] = entry;
- }
+ m_cache_map[file_name] = entry;
+ wlocker.unlock();
update_status(file_name, OBJ_CACHE_SKIP);
- return OBJ_CACHE_NONE;
+ return OBJ_CACHE_NONE; // start promotion request
}
m_free_list_lock.unlock();
RWLock::RLocker rlocker(m_cache_map_lock);
auto entry_it = m_cache_map.find(file_name);
- // simplely promote on first lookup
+ // simply promote on first lookup
if (entry_it == m_cache_map.end()) {
rlocker.unlock();
return alloc_entry(file_name);