| 229 | } |
| 230 | |
| 231 | void LRBCache::admit(const SimpleRequest &req) { |
| 232 | const uint64_t &size = req.size; |
| 233 | if (size > _cacheSize) { |
| 234 | LOG("L", _cacheSize, req.id, size); |
| 235 | return; |
| 236 | } |
| 237 | |
| 238 | auto it = key_map.find(req.id); |
| 239 | if (it == key_map.end()) { |
| 240 | // fresh insert |
| 241 | key_map.insert( |
| 242 | {static_cast<uint64_t>(req.id), {0, (uint32_t)in_cache_metas.size()}}); |
| 243 | auto lru_it = in_cache_lru_queue.request(req.id); |
| 244 | in_cache_metas.emplace_back(req.id, req.size, current_seq, |
| 245 | req.extra_features, lru_it); |
| 246 | _currentSize += size; |
| 247 | } else { |
| 248 | // bring list 1 to list 0 |
| 249 | // first move meta data, then modify hash table |
| 250 | uint32_t tail0_pos = in_cache_metas.size(); |
| 251 | auto &meta = out_cache_metas[it->second.list_pos]; |
| 252 | meta._size = size; |
| 253 | auto forget_timestamp = meta._past_timestamp % memory_window; |
| 254 | negative_candidate_queue->erase(forget_timestamp); |
| 255 | auto it_lru = in_cache_lru_queue.request(req.id); |
| 256 | in_cache_metas.emplace_back(out_cache_metas[it->second.list_pos], it_lru); |
| 257 | uint32_t tail1_pos = out_cache_metas.size() - 1; |
| 258 | if (it->second.list_pos != tail1_pos) { |
| 259 | // swap tail |
| 260 | out_cache_metas[it->second.list_pos] = out_cache_metas[tail1_pos]; |
| 261 | key_map.find(out_cache_metas[tail1_pos]._key)->second.list_pos = |
| 262 | it->second.list_pos; |
| 263 | } |
| 264 | out_cache_metas.pop_back(); |
| 265 | it->second = {0, tail0_pos}; |
| 266 | _currentSize += size; |
| 267 | } |
| 268 | } |
| 269 | |
| 270 | pair<uint64_t, uint32_t> LRBCache::rank() { |
| 271 | { |