| 29 | } |
| 30 | |
| 31 | CacheFile* PersistentCacheMetaData::Evict() { |
| 32 | CacheFile* evicted_file = nullptr; |
| 33 | |
| 34 | { |
| 35 | std::lock_guard<std::mutex> _(evictable_files_lock_); |
| 36 | if (!evictable_files_.empty()) { |
| 37 | auto iter = evictable_files_.begin(); |
| 38 | while (iter != evictable_files_.end() && (*iter)->refs_) { |
| 39 | ++iter; |
| 40 | } |
| 41 | if (iter != evictable_files_.end()) { |
| 42 | evicted_file = *iter; |
| 43 | evictable_files_.erase(iter); |
| 44 | LEVELDB_LOG("Find evictable file for evict, current evictable files size: %lu\n", |
| 45 | evictable_files_.size()); |
| 46 | } |
| 47 | } |
| 48 | } |
| 49 | |
| 50 | if (!evicted_file) { |
| 51 | using std::placeholders::_1; |
| 52 | auto fn = std::bind(&PersistentCacheMetaData::RemoveFileInfo, this, _1); |
| 53 | evicted_file = cache_file_index_.Evict(fn); |
| 54 | } |
| 55 | |
| 56 | return evicted_file; |
| 57 | } |
| 58 | |
| 59 | void PersistentCacheMetaData::Clear() { |
| 60 | cache_file_index_.Clear([](CacheFile* arg) { delete arg; }); |
no test coverage detected