diff --git a/src/main/java/org/apache/hadoop/hbase/io/hfile/slab/SingleSizeCache.java b/src/main/java/org/apache/hadoop/hbase/io/hfile/slab/SingleSizeCache.java index 8ac54e6..78d0565 100644 --- a/src/main/java/org/apache/hadoop/hbase/io/hfile/slab/SingleSizeCache.java +++ b/src/main/java/org/apache/hadoop/hbase/io/hfile/slab/SingleSizeCache.java @@ -51,7 +51,7 @@ import com.google.common.collect.MapMaker; * ConcurrentLinkedHashMap. * **/ -public class SingleSizeCache implements BlockCache { +public class SingleSizeCache implements BlockCache, HeapSize { private final Slab backingStore; private final ConcurrentMap backingMap; private final int numBlocks; @@ -248,19 +248,19 @@ public class SingleSizeCache implements BlockCache { } public long heapSize() { - return this.size() + backingStore.heapSize(); + return this.size.get() + backingStore.heapSize(); } public long size() { - return this.blockSize * this.numBlocks; + return (long) this.blockSize * (long) this.numBlocks; } public long getFreeSize() { - return backingStore.getBlocksRemaining() * blockSize; + return (long) backingStore.getBlocksRemaining() * (long) blockSize; } public long getOccupiedSize() { - return (numBlocks - backingStore.getBlocksRemaining()) * blockSize; + return (long) (numBlocks - backingStore.getBlocksRemaining()) * (long) blockSize; } public long getEvictedCount() { @@ -328,7 +328,7 @@ public class SingleSizeCache implements BlockCache { @Override public long heapSize() { return ClassSize.align(ClassSize.OBJECT + ClassSize.REFERENCE * 3 - + ClassSize.REENTRANT_LOCK); + + ClassSize.ATOMIC_LONG); } } } diff --git a/src/test/java/org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java b/src/test/java/org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java index 5100062..603641d 100644 --- a/src/test/java/org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java +++ b/src/test/java/org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java @@ -33,9 +33,25 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.MultithreadedTestUtil; import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread; +import org.apache.hadoop.hbase.io.HeapSize; public class CacheTestUtils { + /*Just checks if heapsize grows when something is cached, and gets smaller when the same object is evicted*/ + + public static void testHeapSizeChanges(final BlockCache toBeTested, final int blockSize){ + HFileBlockPair[] blocks = generateHFileBlocks(blockSize, 1); + long heapSize = ((HeapSize) toBeTested).heapSize(); + toBeTested.cacheBlock(blocks[0].blockName, blocks[0].block); + + /*When we cache something HeapSize should always increase */ + assertTrue(heapSize < ((HeapSize) toBeTested).heapSize()); + + toBeTested.evictBlock(blocks[0].blockName); + + /*Post eviction, heapsize should be the same */ + assertEquals(heapSize, ((HeapSize) toBeTested).heapSize()); + } public static void testCacheMultiThreaded(final BlockCache toBeTested, final int blockSize, final int numThreads, final int numQueries, final double passingScore) throws Exception { diff --git a/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSingleSizeCache.java b/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSingleSizeCache.java index 6881188..124ad72 100644 --- a/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSingleSizeCache.java +++ b/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSingleSizeCache.java @@ -63,10 +63,15 @@ public class TestSingleSizeCache { public void testCacheMultiThreadedSingleKey() throws Exception { CacheTestUtils.hammerSingleKey(cache, BLOCK_SIZE, NUM_THREADS, NUM_QUERIES); } - + @Test public void testCacheMultiThreadedEviction() throws Exception { CacheTestUtils.hammerEviction(cache, BLOCK_SIZE, NUM_THREADS, NUM_QUERIES); } + @Test + public void testHeapSizeChanges(){ + CacheTestUtils.testHeapSizeChanges(cache, BLOCK_SIZE); + } + } diff --git a/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSlabCache.java b/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSlabCache.java index 2c3541f..cf02c2b 100644 --- a/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSlabCache.java +++ b/src/test/java/org/apache/hadoop/hbase/io/hfile/slab/TestSlabCache.java @@ -97,4 +97,9 @@ public class TestSlabCache { test.getUpperBound(i) <= test.getLowerBound(i + 1)); } } + + @Test + public void testHeapSizeChanges(){ + CacheTestUtils.testHeapSizeChanges(cache, BLOCK_SIZE); + } }