From 9382f391c8ce44cc4de22ab5b10a1f4e8046dff7 Mon Sep 17 00:00:00 2001 From: Andrew Purtell Date: Tue, 31 Oct 2017 11:35:48 -0700 Subject: [PATCH] HBASE-19138 Rare failure in TestLruBlockCache Wait for the block count to drop to zero after awaiting shutdown of the executor pool --- .../hadoop/hbase/io/hfile/TestLruBlockCache.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 b4dfc0c6ef8..4eec0bfbab8 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 @@ -32,6 +32,10 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.hadoop.hbase.testclassification.IOTests; import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.Waiter; +import org.apache.hadoop.hbase.Waiter.ExplainingPredicate; import org.apache.hadoop.hbase.io.HeapSize; import org.apache.hadoop.hbase.io.hfile.LruBlockCache.EvictionThread; import org.apache.hadoop.hbase.util.ClassSize; @@ -56,6 +60,7 @@ public class TestLruBlockCache { final long blockSize = calculateBlockSizeDefault(maxSize, numBlocks); assertTrue("calculateBlockSize appears broken.", blockSize * numBlocks <= maxSize); + final Configuration conf = HBaseConfiguration.create(); final LruBlockCache cache = new LruBlockCache(maxSize, blockSize); EvictionThread evictionThread = cache.getEvictionThread(); assertTrue(evictionThread != null); @@ -84,6 +89,17 @@ public class TestLruBlockCache { service.shutdown(); // The test may fail here if the evict thread frees the blocks too fast service.awaitTermination(10, TimeUnit.MINUTES); + Waiter.waitFor(conf, 10000, 100, new ExplainingPredicate() { + @Override + public boolean evaluate() throws Exception { + return cache.getBlockCount() == 0; + } + + @Override + public String explainFailure() throws Exception { + return "Cache block count failed to return to 0"; + } + }); assertEquals(0, cache.getBlockCount()); assertEquals(cache.getOverhead(), cache.getCurrentSize()); }