public int getTotalBufferSize() { return super.getTotalBufferSize() + compressed.capacity(); }
public long sizeInBytes() { long n = 0; for (CacheBucket bucket : cache.asMap().values()) for (RandomAccessReader reader : bucket.queue) n += reader.getTotalBufferSize(); return n; } }
public RandomAccessReader get(CacheKey key) { metrics.requests.mark(); CacheBucket bucket = getCacheFor(key); RandomAccessReader result = bucket.queue.poll(); if (result != null) { metrics.hits.mark(); memoryUsage.addAndGet(-result.getTotalBufferSize()); } return result; }
public void put(CacheKey cacheKey, RandomAccessReader instance) { int memoryUsed = memoryUsage.get(); if (logger.isDebugEnabled()) logger.debug("Estimated memory usage is {} compared to actual usage {}", memoryUsed, sizeInBytes()); CacheBucket bucket = cache.getIfPresent(cacheKey); if (memoryUsed >= MEMORY_USAGE_THRESHOLD || bucket == null) { instance.deallocate(); } else { memoryUsage.addAndGet(instance.getTotalBufferSize()); bucket.queue.add(instance); if (bucket.discarded) { RandomAccessReader reader = bucket.queue.poll(); if (reader != null) { memoryUsage.addAndGet(-1 * reader.getTotalBufferSize()); reader.deallocate(); } } } }
@Override public void onRemoval(RemovalNotification<CacheKey, CacheBucket> notification) { CacheBucket bucket = notification.getValue(); if (bucket == null) return; // set discarded before deallocating the readers, to ensure we don't leak any bucket.discarded = true; Queue<RandomAccessReader> q = bucket.queue; boolean first = true; for (RandomAccessReader reader = q.poll() ; reader != null ; reader = q.poll()) { if (logger.isDebugEnabled() && first) { logger.debug("Evicting cold readers for {}", reader.getPath()); first = false; } memoryUsage.addAndGet(-1 * reader.getTotalBufferSize()); reader.deallocate(); } } };