You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2016/07/01 16:43:44 UTC
hbase git commit: HBASE-16157 The incorrect block cache count and
size are caused by removing duplicate block key in the LruBlockCache
(ChiaPing Tsai)
Repository: hbase
Updated Branches:
refs/heads/master bc70dc00b -> 5a7c9939c
HBASE-16157 The incorrect block cache count and size are caused by removing duplicate block key in the LruBlockCache (ChiaPing Tsai)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/5a7c9939
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/5a7c9939
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/5a7c9939
Branch: refs/heads/master
Commit: 5a7c9939cbe115c0d12d9cfe8bf9f3b3d11ac69e
Parents: bc70dc0
Author: tedyu <yu...@gmail.com>
Authored: Fri Jul 1 09:43:39 2016 -0700
Committer: tedyu <yu...@gmail.com>
Committed: Fri Jul 1 09:43:39 2016 -0700
----------------------------------------------------------------------
.../hadoop/hbase/io/hfile/LruBlockCache.java | 15 ++++++++-
.../hbase/io/hfile/TestLruBlockCache.java | 32 ++++++++++++++++++++
2 files changed, 46 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/5a7c9939/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
index c380318..8894dcd 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
@@ -511,7 +511,10 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
* @return the heap size of evicted block
*/
protected long evictBlock(LruCachedBlock block, boolean evictedByEvictionProcess) {
- map.remove(block.getCacheKey());
+ boolean found = map.remove(block.getCacheKey()) != null;
+ if (!found) {
+ return 0;
+ }
updateSizeMetrics(block, true);
long val = elements.decrementAndGet();
if (LOG.isTraceEnabled()) {
@@ -543,6 +546,16 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
}
}
+ @VisibleForTesting
+ boolean isEvictionInProgress() {
+ return evictionInProgress;
+ }
+
+ @VisibleForTesting
+ long getOverhead() {
+ return overhead;
+ }
+
/**
* Eviction method.
*/
http://git-wip-us.apache.org/repos/asf/hbase/blob/5a7c9939/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java
index d7f9aba..4d0732e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java
@@ -44,7 +44,34 @@ import org.junit.experimental.categories.Category;
@Category({IOTests.class, SmallTests.class})
public class TestLruBlockCache {
+ @Test
+ public void testCurrentSize() throws Exception {
+ long maxSize = 100000;
+ int numBlocks = 9;
+ int testRuns = 10;
+ long blockSize = calculateBlockSizeDefault(maxSize, numBlocks);
+ assertTrue("calculateBlockSize appears broken.", blockSize * numBlocks <= maxSize);
+ LruBlockCache cache = new LruBlockCache(maxSize, blockSize);
+ EvictionThread evictionThread = cache.getEvictionThread();
+ assertTrue(evictionThread != null);
+ while (!evictionThread.isEnteringRun()) {
+ Thread.sleep(1);
+ }
+ int blockCount = 0;
+ String hfileName = "hfile";
+ for (int run = 0; run != testRuns; ++run) {
+ while (!cache.isEvictionInProgress()) {
+ CachedItem block = new CachedItem(hfileName, (int) blockSize, blockCount++);
+ boolean inMemory = Math.random() > 0.5;
+ cache.cacheBlock(block.cacheKey, block, inMemory, false);
+ }
+ assertEquals(true, cache.isEvictionInProgress());
+ cache.evictBlocksByHfileName(hfileName);
+ assertEquals(0, cache.getBlockCount());
+ assertEquals(cache.getOverhead(), cache.getCurrentSize());
+ }
+ }
@Test
public void testBackgroundEvictionThread() throws Exception {
long maxSize = 100000;
@@ -785,6 +812,11 @@ public class TestLruBlockCache {
BlockCacheKey cacheKey;
int size;
+ CachedItem(String blockName, int size, int offset) {
+ this.cacheKey = new BlockCacheKey(blockName, offset);
+ this.size = size;
+ }
+
CachedItem(String blockName, int size) {
this.cacheKey = new BlockCacheKey(blockName, 0);
this.size = size;