diff --git a/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlock.java b/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlock.java index 9300c13..fa0a79d 100644 --- a/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlock.java +++ b/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlock.java @@ -108,5 +108,4 @@ public class CachedBlock implements HeapSize, Comparable { public BlockPriority getPriority() { return this.priority; } -} - +} \ No newline at end of file diff --git a/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java b/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java index ab96ac1..963bc8f 100644 --- a/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java +++ b/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java @@ -84,15 +84,14 @@ public class CachedBlockQueue implements HeapSize { } /** - * Get a sorted List of all elements in this queue, in descending order. - * @return list of cached elements in descending order + * @return a sorted List of all elements in this queue, in descending order */ - public CachedBlock [] get() { + public LinkedList get() { LinkedList blocks = new LinkedList(); - while(!queue.isEmpty()) { + while (!queue.isEmpty()) { blocks.addFirst(queue.poll()); } - return blocks.toArray(new CachedBlock[blocks.size()]); + return blocks; } /** diff --git a/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java b/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java index cef5d9d..0080c55 100644 --- a/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java +++ b/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.io.hfile; import java.lang.ref.WeakReference; import java.nio.ByteBuffer; +import java.util.LinkedList; import java.util.PriorityQueue; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; @@ -34,6 +35,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.io.HeapSize; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.ClassSize; +import org.apache.hadoop.util.StringUtils; /** * A block cache implementation that is memory-aware using {@link HeapSize}, @@ -317,11 +319,14 @@ public class LruBlockCache implements BlockCache, HeapSize { try { evictionInProgress = true; + long currentSize = this.size.get(); + long bytesToFree = currentSize - minSize(); - long bytesToFree = size.get() - minSize(); - - LOG.debug("Block cache LRU eviction started. Attempting to free " + - bytesToFree + " bytes"); + if (LOG.isDebugEnabled()) { + LOG.debug("Block cache LRU eviction started; Attempting to free " + + StringUtils.byteDesc(bytesToFree) + " of total=" + + StringUtils.byteDesc(currentSize)); + } if(bytesToFree <= 0) return; @@ -372,17 +377,17 @@ public class LruBlockCache implements BlockCache, HeapSize { remainingBuckets--; } - float singleMB = ((float)bucketSingle.totalSize())/((float)(1024*1024)); - float multiMB = ((float)bucketMulti.totalSize())/((float)(1024*1024)); - float memoryMB = ((float)bucketMemory.totalSize())/((float)(1024*1024)); - - LOG.debug("Block cache LRU eviction completed. " + - "Freed " + bytesFreed + " bytes. " + - "Priority Sizes: " + - "Single=" + singleMB + "MB (" + bucketSingle.totalSize() + "), " + - "Multi=" + multiMB + "MB (" + bucketMulti.totalSize() + ")," + - "Memory=" + memoryMB + "MB (" + bucketMemory.totalSize() + ")"); - + if (LOG.isDebugEnabled()) { + long single = bucketSingle.totalSize(); + long multi = bucketMulti.totalSize(); + long memory = bucketMemory.totalSize(); + LOG.debug("Block cache LRU eviction completed; " + + "freed=" + StringUtils.byteDesc(bytesFreed) + ", " + + "total=" + StringUtils.byteDesc(this.size.get()) + ", " + + "single=" + StringUtils.byteDesc(single) + ", " + + "multi=" + StringUtils.byteDesc(multi) + ", " + + "memory=" + StringUtils.byteDesc(memory)); + } } finally { stats.evict(); evictionInProgress = false; @@ -414,10 +419,10 @@ public class LruBlockCache implements BlockCache, HeapSize { } public long free(long toFree) { - CachedBlock [] blocks = queue.get(); + LinkedList blocks = queue.get(); long freedBytes = 0; - for(int i=0; i= toFree) { return freedBytes; } @@ -524,7 +529,7 @@ public class LruBlockCache implements BlockCache, HeapSize { /* * Statistics thread. Periodically prints the cache statistics to the log. */ - private static class StatisticsThread extends Thread { + static class StatisticsThread extends Thread { LruBlockCache lru; public StatisticsThread(LruBlockCache lru) { @@ -539,27 +544,23 @@ public class LruBlockCache implements BlockCache, HeapSize { } public void logStats() { + if (!LOG.isDebugEnabled()) return; // Log size long totalSize = heapSize(); long freeSize = maxSize - totalSize; - float sizeMB = ((float)totalSize)/((float)(1024*1024)); - float freeMB = ((float)freeSize)/((float)(1024*1024)); - float maxMB = ((float)maxSize)/((float)(1024*1024)); - LruBlockCache.LOG.debug("Cache Stats: Sizes: " + - "Total=" + sizeMB + "MB (" + totalSize + "), " + - "Free=" + freeMB + "MB (" + freeSize + "), " + - "Max=" + maxMB + "MB (" + maxSize +")" + - ", Counts: " + - "Blocks=" + size() +", " + - "Access=" + stats.getRequestCount() + ", " + - "Hit=" + stats.getHitCount() + ", " + - "Miss=" + stats.getMissCount() + ", " + - "Evictions=" + stats.getEvictionCount() + ", " + - "Evicted=" + stats.getEvictedCount() + - ", Ratios: " + - "Hit Ratio=" + stats.getHitRatio()*100 + "%, " + - "Miss Ratio=" + stats.getMissRatio()*100 + "%, " + - "Evicted/Run=" + stats.evictedPerEviction()); + LruBlockCache.LOG.debug("LRU Stats: " + + "total=" + StringUtils.byteDesc(totalSize) + ", " + + "free=" + StringUtils.byteDesc(freeSize) + ", " + + "max=" + StringUtils.byteDesc(this.maxSize) + ", " + + "blocks=" + size() +", " + + "accesses=" + stats.getRequestCount() + ", " + + "hits=" + stats.getHitCount() + ", " + + "misses=" + stats.getMissCount() + ", " + + "evictions=" + stats.getEvictionCount() + ", " + + "evicted=" + stats.getEvictedCount() + ", " + + "hitRatio=" + StringUtils.formatPercent(stats.getHitRatio(), 2) + "%, " + + "missRatio=" + StringUtils.formatPercent(stats.getMissRatio(), 2) + "%, " + + "evictedPerRun=" + stats.evictedPerEviction()); } /** diff --git a/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java b/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java index 0c6e162..ba79c82 100644 --- a/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java +++ b/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java @@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.io.hfile; import java.nio.ByteBuffer; +import java.util.LinkedList; + import junit.framework.TestCase; public class TestCachedBlockQueue extends TestCase { @@ -57,15 +59,16 @@ public class TestCachedBlockQueue extends TestCase { assertEquals(queue.heapSize(), expectedSize); - org.apache.hadoop.hbase.io.hfile.CachedBlock [] blocks = queue.get(); - assertEquals(blocks[0].getName(), "cb1"); - assertEquals(blocks[1].getName(), "cb2"); - assertEquals(blocks[2].getName(), "cb3"); - assertEquals(blocks[3].getName(), "cb4"); - assertEquals(blocks[4].getName(), "cb5"); - assertEquals(blocks[5].getName(), "cb6"); - assertEquals(blocks[6].getName(), "cb7"); - assertEquals(blocks[7].getName(), "cb8"); + LinkedList blocks = + queue.get(); + assertEquals(blocks.poll().getName(), "cb1"); + assertEquals(blocks.poll().getName(), "cb2"); + assertEquals(blocks.poll().getName(), "cb3"); + assertEquals(blocks.poll().getName(), "cb4"); + assertEquals(blocks.poll().getName(), "cb5"); + assertEquals(blocks.poll().getName(), "cb6"); + assertEquals(blocks.poll().getName(), "cb7"); + assertEquals(blocks.poll().getName(), "cb8"); } @@ -109,16 +112,16 @@ public class TestCachedBlockQueue extends TestCase { assertEquals(queue.heapSize(), expectedSize); - org.apache.hadoop.hbase.io.hfile.CachedBlock [] blocks = queue.get(); - assertEquals(blocks[0].getName(), "cb0"); - assertEquals(blocks[1].getName(), "cb1"); - assertEquals(blocks[2].getName(), "cb2"); - assertEquals(blocks[3].getName(), "cb3"); - assertEquals(blocks[4].getName(), "cb4"); - assertEquals(blocks[5].getName(), "cb5"); - assertEquals(blocks[6].getName(), "cb6"); - assertEquals(blocks[7].getName(), "cb7"); - assertEquals(blocks[8].getName(), "cb8"); + LinkedList blocks = queue.get(); + assertEquals(blocks.poll().getName(), "cb0"); + assertEquals(blocks.poll().getName(), "cb1"); + assertEquals(blocks.poll().getName(), "cb2"); + assertEquals(blocks.poll().getName(), "cb3"); + assertEquals(blocks.poll().getName(), "cb4"); + assertEquals(blocks.poll().getName(), "cb5"); + assertEquals(blocks.poll().getName(), "cb6"); + assertEquals(blocks.poll().getName(), "cb7"); + assertEquals(blocks.poll().getName(), "cb8"); } @@ -130,5 +133,4 @@ public class TestCachedBlockQueue extends TestCase { accessTime,false); } } - -} +} \ No newline at end of file diff --git a/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java b/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java index bcde04a..f5976f4 100644 --- a/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java +++ b/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java @@ -117,6 +117,9 @@ public class TestLruBlockCache extends TestCase { // Expect no evictions assertEquals(0, cache.getEvictionCount()); + Thread t = new LruBlockCache.StatisticsThread(cache); + t.start(); + t.join(); } public void testCacheEvictionSimple() throws Exception {