HBASE-26835 Rewrite TestLruAdaptiveBlockCache to make it more stable (#4219)
Signed-off-by: Xiaolin Ha <haxiaolin@apache.org>
(cherry picked from commit 5ad51e8b2b
)
This commit is contained in:
parent
95f4128973
commit
920cf9d7d4
|
@ -66,6 +66,8 @@ public class TestLruAdaptiveBlockCache {
|
|||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(TestLruAdaptiveBlockCache.class);
|
||||
|
||||
private static final Configuration CONF = HBaseConfiguration.create();
|
||||
|
||||
@Test
|
||||
public void testCacheEvictionThreadSafe() throws Exception {
|
||||
long maxSize = 100000;
|
||||
|
@ -74,13 +76,10 @@ public class TestLruAdaptiveBlockCache {
|
|||
final long blockSize = calculateBlockSizeDefault(maxSize, numBlocks);
|
||||
assertTrue("calculateBlockSize appears broken.", blockSize * numBlocks <= maxSize);
|
||||
|
||||
final Configuration conf = HBaseConfiguration.create();
|
||||
final LruAdaptiveBlockCache cache = new LruAdaptiveBlockCache(maxSize, blockSize);
|
||||
EvictionThread evictionThread = cache.getEvictionThread();
|
||||
assertNotNull(evictionThread);
|
||||
while (!evictionThread.isEnteringRun()) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
Waiter.waitFor(CONF, 10000, 100, () -> evictionThread.isEnteringRun());
|
||||
final String hfileName = "hfile";
|
||||
int threads = 10;
|
||||
final int blocksPerThread = 5 * numBlocks;
|
||||
|
@ -102,7 +101,7 @@ public class TestLruAdaptiveBlockCache {
|
|||
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<Exception>() {
|
||||
Waiter.waitFor(CONF, 10000, 100, new ExplainingPredicate<Exception>() {
|
||||
@Override
|
||||
public boolean evaluate() throws Exception {
|
||||
return cache.getBlockCount() == 0;
|
||||
|
@ -133,9 +132,7 @@ public class TestLruAdaptiveBlockCache {
|
|||
CachedItem[] blocks = generateFixedBlocks(numBlocks + 1, blockSize, "block");
|
||||
|
||||
// Make sure eviction thread has entered run method
|
||||
while (!evictionThread.isEnteringRun()) {
|
||||
Thread.sleep(1);
|
||||
}
|
||||
Waiter.waitFor(CONF, 10000, 10, () -> evictionThread.isEnteringRun());
|
||||
|
||||
// Add all the blocks
|
||||
for (CachedItem block : blocks) {
|
||||
|
@ -143,12 +140,19 @@ public class TestLruAdaptiveBlockCache {
|
|||
}
|
||||
|
||||
// wait until at least one eviction has run
|
||||
int n = 0;
|
||||
while(cache.getStats().getEvictionCount() == 0) {
|
||||
Thread.sleep(200);
|
||||
assertTrue("Eviction never happened.", n++ < 20);
|
||||
Waiter.waitFor(CONF, 30000, 200, new ExplainingPredicate<Exception>() {
|
||||
|
||||
@Override
|
||||
public boolean evaluate() throws Exception {
|
||||
return cache.getStats().getEvictionCount() > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String explainFailure() throws Exception {
|
||||
return "Eviction never happened.";
|
||||
}
|
||||
});
|
||||
|
||||
// let cache stabilize
|
||||
// On some systems, the cache will run multiple evictions before it attains
|
||||
// steady-state. For instance, after populating the cache with 10 blocks,
|
||||
|
@ -156,22 +160,20 @@ public class TestLruAdaptiveBlockCache {
|
|||
// evicts another. I think this is due to the delta between minSize and
|
||||
// acceptableSize, combined with variance between object overhead on
|
||||
// different environments.
|
||||
n = 0;
|
||||
for (long prevCnt = 0 /* < number of blocks added */,
|
||||
curCnt = cache.getBlockCount();
|
||||
prevCnt != curCnt; prevCnt = curCnt, curCnt = cache.getBlockCount()) {
|
||||
int n = 0;
|
||||
for (long prevCnt = 0 /* < number of blocks added */, curCnt =
|
||||
cache.getBlockCount(); prevCnt != curCnt; prevCnt = curCnt, curCnt = cache.getBlockCount()) {
|
||||
Thread.sleep(200);
|
||||
assertTrue("Cache never stabilized.", n++ < 20);
|
||||
assertTrue("Cache never stabilized.", n++ < 100);
|
||||
}
|
||||
|
||||
long evictionCount = cache.getStats().getEvictionCount();
|
||||
assertTrue(evictionCount >= 1);
|
||||
System.out.println("Background Evictions run: " + evictionCount);
|
||||
LOG.info("Background Evictions run: {}", evictionCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCacheSimple() throws Exception {
|
||||
|
||||
long maxSize = 1000000;
|
||||
long blockSize = calculateBlockSizeDefault(maxSize, 101);
|
||||
|
||||
|
@ -233,7 +235,6 @@ public class TestLruAdaptiveBlockCache {
|
|||
|
||||
@Test
|
||||
public void testCacheEvictionSimple() throws Exception {
|
||||
|
||||
long maxSize = 100000;
|
||||
long blockSize = calculateBlockSizeDefault(maxSize, 10);
|
||||
|
||||
|
@ -275,7 +276,6 @@ public class TestLruAdaptiveBlockCache {
|
|||
|
||||
@Test
|
||||
public void testCacheEvictionTwoPriorities() throws Exception {
|
||||
|
||||
long maxSize = 100000;
|
||||
long blockSize = calculateBlockSizeDefault(maxSize, 10);
|
||||
|
||||
|
@ -339,7 +339,6 @@ public class TestLruAdaptiveBlockCache {
|
|||
|
||||
@Test
|
||||
public void testCacheEvictionThreePriorities() throws Exception {
|
||||
|
||||
long maxSize = 100000;
|
||||
long blockSize = calculateBlockSize(maxSize, 10);
|
||||
|
||||
|
@ -691,7 +690,6 @@ public class TestLruAdaptiveBlockCache {
|
|||
CachedItem[] tooLong = generateFixedBlocks(10, 1024+5, "long");
|
||||
CachedItem[] small = generateFixedBlocks(15, 600, "small");
|
||||
|
||||
|
||||
for (CachedItem i:tooLong) {
|
||||
cache.cacheBlock(i.cacheKey, i);
|
||||
}
|
||||
|
@ -712,7 +710,6 @@ public class TestLruAdaptiveBlockCache {
|
|||
// test setMaxSize
|
||||
@Test
|
||||
public void testResizeBlockCache() throws Exception {
|
||||
|
||||
long maxSize = 300000;
|
||||
long blockSize = calculateBlockSize(maxSize, 31);
|
||||
|
||||
|
@ -738,7 +735,6 @@ public class TestLruAdaptiveBlockCache {
|
|||
|
||||
// Add all blocks from all priorities
|
||||
for (int i = 0; i < 10; i++) {
|
||||
|
||||
// Just add single blocks
|
||||
cache.cacheBlock(singleBlocks[i].cacheKey, singleBlocks[i]);
|
||||
|
||||
|
@ -1126,9 +1122,7 @@ public class TestLruAdaptiveBlockCache {
|
|||
|
||||
EvictionThread evictionThread = cache.getEvictionThread();
|
||||
assertNotNull(evictionThread);
|
||||
while (!evictionThread.isEnteringRun()) {
|
||||
Thread.sleep(1);
|
||||
}
|
||||
Waiter.waitFor(CONF, 10000, 10, () -> evictionThread.isEnteringRun());
|
||||
|
||||
final String hfileName = "hfile";
|
||||
for (int blockIndex = 0; blockIndex <= numBlocks * 3000; ++blockIndex) {
|
||||
|
|
Loading…
Reference in New Issue