def cache_object(self, obj_id, size, xtime, next_line=None, force=True): # No, this goes horribly wrong because LRUCache uses # this method internally to put the obj_id on top of the stack # self._cache_frequencies[obj_id] = 0 if obj_id not in self._cache_frequencies: self._cache_frequencies[obj_id] = 0 LRUCache.cache_object(self, obj_id, size, xtime)
class SplitLRUCache(AbstractCache.AbstractCache): def __init__(self, cache_size, min_obj_size, max_obj_size): """ cache_size in bytes. """ self._max_size = cache_size self.stats = CacheStats.CacheStats("LRU", cache_size) self.daily_stats = CacheStats.DailyCacheStats(cache_size) ts = int(time.time()) get_size = int(0.333333 * cache_size) put_size = int(0.666666 * cache_size) self.get_lru = LRUCache(get_size, 0, 0) self.put_fifo = LRUCache(put_size, 0, 0) def get_cache_stats_total(self): return self.stats.to_dict() def get_cache_stats_day(self): # self.daily_stats.cache_used = self._used_size s = self.daily_stats.to_dict() self.daily_stats.reset() return s def get_num_cached_objects(self): return self.get_lru.get_num_cached_objects() + self.put_fifo.get_num_cached_objects() def is_cached(self, obj_id): return self.get_lru.is_cached(obj_id) or self.put_fifo.is_cached(obj_id) def is_remembered(self, obj_id): return self.is_cached(obj_id) def get_free_cache_bytes(self): return self.get_lru.get_free_cache_bytes() + self.put_fifo.get_free_cache_bytes() def update_obj_size(self, obj_id, size, delta): if self.get_lru.is_cached(obj_id): self.get_lru.update_obj_size(obj_id, size, delta) if self.put_fifo.is_cached(obj_id): self.put_fifo.update_obj_size(obj_id, size, delta) def remove_cached(self, obj_id): if self.get_lru.is_cached(obj_id): self.stats.deleted_objects += 1 self.stats.cached_objects_current -= 1 self.daily_stats.deleted_objects += 1 return self.get_lru.remove_cached(obj_id) if self.put_fifo.is_cached(obj_id): self.stats.deleted_objects += 1 self.stats.cached_objects_current -= 1 self.daily_stats.deleted_objects += 1 return self.put_fifo.remove_cached(obj_id) return None def cache_object(self, obj_id, size, xtime, next_line=None, force=True, is_new=False): if is_new: self.put_fifo.cache_object(obj_id, size, xtime, next_line, force) else: self.put_fifo.cache_object(obj_id, size, xtime, next_line, force) def get_cached(self, obj_id, xtime, next_line=None): if self.get_lru.is_cached(obj_id) or self.put_fifo.is_cached(obj_id): self.stats.cache_hits += 1 self.daily_stats.cache_hits += 1 return True self.stats.cache_misses += 1 self.daily_stats.cache_misses += 1 return False def rename(self, from_obj_id, to_obj_id): self.get_lru.rename(from_obj_id, to_obj_id) self.put_fifo.rename(from_obj_id, to_obj_id) def check_sanity(self): return True def dump_cache(self, reason): print ("dump")