org.apache.accumulo.core.file.blockfile.cache
public class LruBlockCache extends Object implements BlockCache, HeapSize
HeapSize
, memory-bound using an LRU eviction algorithm, and concurrent: backed by a
ConcurrentHashMap
and with a non-blocking eviction thread giving constant-time cacheBlock(java.lang.String, byte[], boolean)
and getBlock(java.lang.String)
operations.
Contains three levels of block priority to allow for scan-resistance and in-memory families. A block is added with an inMemory flag if necessary, otherwise a block becomes a single access priority. Once a blocked is accessed again, it changes to multiple access. This is used to prevent scans from thrashing the cache, adding a least-frequently-used element to the eviction algorithm.
Each priority is given its own chunk of the total cache to ensure fairness during eviction. Each priority will retain close to its maximum size, however, if any priority is not using its entire chunk the others are able to grow beyond their chunk size.
Instantiated at a minimum with the total size and average block size. All sizes are in bytes. The block size is not especially important as this cache is fully dynamic in its sizing of blocks. It is only used for pre-allocating data structures and in initial heap estimation of the map.
The detailed constructor defines the sizes for the three priorities (they should total to the maximum size defined). It also sets the levels that trigger and control the eviction thread.
The acceptable size is the cache size level which triggers the eviction process to start. It evicts enough blocks to get the size below the minimum size specified.
Eviction happens in a separate thread and involves a single full-scan of the map. It determines how many bytes must be freed to reach the minimum size, and then while scanning determines the fewest least-recently-used blocks necessary from each of the three priorities (would be 3 times bytes to free). It then uses the priority chunk sizes to evict fairly according to the relative sizes and usage.
Modifier and Type | Class and Description |
---|---|
static class |
LruBlockCache.CacheStats |
Modifier and Type | Field and Description |
---|---|
static long |
CACHE_FIXED_OVERHEAD |
Constructor and Description |
---|
LruBlockCache(long maxSize,
long blockSize)
Default constructor.
|
LruBlockCache(long maxSize,
long blockSize,
boolean evictionThread)
Constructor used for testing.
|
LruBlockCache(long maxSize,
long blockSize,
boolean evictionThread,
int mapInitialSize,
float mapLoadFactor,
int mapConcurrencyLevel,
float minFactor,
float acceptableFactor,
float singleFactor,
float multiFactor,
float memoryFactor)
Configurable constructor.
|
Modifier and Type | Method and Description |
---|---|
CacheEntry |
cacheBlock(String blockName,
byte[] buf)
Cache the block with the specified name and buffer.
|
CacheEntry |
cacheBlock(String blockName,
byte[] buf,
boolean inMemory)
Cache the block with the specified name and buffer.
|
static long |
calculateOverhead(long maxSize,
long blockSize,
int concurrency) |
protected long |
evictBlock(CachedBlock block) |
CachedBlock |
getBlock(String blockName)
Get the buffer of the block with the specified name.
|
long |
getCurrentSize()
Get the current size of this cache.
|
long |
getEvictedCount()
Get the number of blocks that have been evicted during the lifetime of this cache.
|
long |
getEvictionCount()
Get the number of eviction runs that have occurred
|
long |
getFreeSize()
Get the current size of this cache.
|
long |
getMaxSize()
Get the maximum size of this cache.
|
LruBlockCache.CacheStats |
getStats()
Get counter statistics for this cache.
|
long |
heapSize() |
void |
logStats() |
void |
setMaxSize(long maxSize) |
void |
shutdown()
Shutdown the cache.
|
long |
size()
Get the size of this cache (number of cached blocks)
|
public LruBlockCache(long maxSize, long blockSize)
All other factors will be calculated based on defaults specified in this class.
maxSize
- maximum size of cache, in bytesblockSize
- approximate size of each block, in bytespublic LruBlockCache(long maxSize, long blockSize, boolean evictionThread)
public LruBlockCache(long maxSize, long blockSize, boolean evictionThread, int mapInitialSize, float mapLoadFactor, int mapConcurrencyLevel, float minFactor, float acceptableFactor, float singleFactor, float multiFactor, float memoryFactor)
maxSize
- maximum size of this cache, in bytesblockSize
- expected average size of blocks, in bytesevictionThread
- whether to run evictions in a bg thread or notmapInitialSize
- initial size of backing ConcurrentHashMapmapLoadFactor
- initial load factor of backing ConcurrentHashMapmapConcurrencyLevel
- initial concurrency factor for backing CHMminFactor
- percentage of total size that eviction will evict untilacceptableFactor
- percentage of total size that triggers evictionsingleFactor
- percentage of total size for single-access blocksmultiFactor
- percentage of total size for multiple-access blocksmemoryFactor
- percentage of total size for in-memory blockspublic void setMaxSize(long maxSize)
public CacheEntry cacheBlock(String blockName, byte[] buf, boolean inMemory)
It is assumed this will NEVER be called on an already cached block. If that is done, it is assumed that you are reinserting the same exact block due to a race condition and will update the buffer but not modify the size of the cache.
cacheBlock
in interface BlockCache
blockName
- block namebuf
- block bufferinMemory
- if block is in-memorypublic CacheEntry cacheBlock(String blockName, byte[] buf)
It is assumed this will NEVER be called on an already cached block. If that is done, it is assumed that you are reinserting the same exact block due to a race condition and will update the buffer but not modify the size of the cache.
cacheBlock
in interface BlockCache
blockName
- block namebuf
- block bufferpublic CachedBlock getBlock(String blockName)
getBlock
in interface BlockCache
blockName
- block nameprotected long evictBlock(CachedBlock block)
public long getMaxSize()
getMaxSize
in interface BlockCache
public long getCurrentSize()
public long getFreeSize()
public long size()
public long getEvictionCount()
public long getEvictedCount()
public void logStats()
public LruBlockCache.CacheStats getStats()
Includes: total accesses, hits, misses, evicted blocks, and runs of the eviction processes.
public long heapSize()
public static long calculateOverhead(long maxSize, long blockSize, int concurrency)
public void shutdown()
BlockCache
shutdown
in interface BlockCache
Copyright © 2011–2016 The Apache Software Foundation. All rights reserved.