HBASE-26830 Rewrite TestLruBlockCache to make it more stable (#4212)

Signed-off-by: Xiaolin Ha <haxiaolin@apache.org>
(cherry picked from commit c3d0cc7040)
This commit is contained in:
Duo Zhang 2022-03-14 11:04:15 +08:00
parent fd356e6682
commit cffb006d8d
1 changed files with 40 additions and 43 deletions

View File

@ -66,6 +66,8 @@ public class TestLruBlockCache {
private static final Logger LOG = LoggerFactory.getLogger(TestLruBlockCache.class);
private static final Configuration CONF = HBaseConfiguration.create();
@Test
public void testCacheEvictionThreadSafe() throws Exception {
long maxSize = 100000;
@ -74,13 +76,10 @@ 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);
while (!evictionThread.isEnteringRun()) {
Thread.sleep(1);
}
Waiter.waitFor(CONF, 10000, 100, () -> evictionThread.isEnteringRun());
final String hfileName = "hfile";
int threads = 10;
final int blocksPerThread = 5 * numBlocks;
@ -103,7 +102,7 @@ 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<Exception>() {
Waiter.waitFor(CONF, 10000, 100, new ExplainingPredicate<Exception>() {
@Override
public boolean evaluate() throws Exception {
return cache.getBlockCount() == 0;
@ -132,9 +131,7 @@ public class TestLruBlockCache {
CachedItem[] blocks = generateFixedBlocks(numBlocks + 1, blockSize, "block");
// Make sure eviction thread has entered run method
while (!evictionThread.isEnteringRun()) {
Thread.sleep(10);
}
Waiter.waitFor(CONF, 10000, 10, () -> evictionThread.isEnteringRun());
// Add all the blocks
for (CachedItem block : blocks) {
@ -142,12 +139,19 @@ public class TestLruBlockCache {
}
// 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,
@ -155,22 +159,20 @@ public class TestLruBlockCache {
// 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);
@ -229,7 +231,6 @@ public class TestLruBlockCache {
@Test
public void testCacheEvictionSimple() throws Exception {
long maxSize = 100000;
long blockSize = calculateBlockSizeDefault(maxSize, 10);
@ -269,7 +270,6 @@ public class TestLruBlockCache {
@Test
public void testCacheEvictionTwoPriorities() throws Exception {
long maxSize = 100000;
long blockSize = calculateBlockSizeDefault(maxSize, 10);
@ -328,7 +328,6 @@ public class TestLruBlockCache {
@Test
public void testCacheEvictionThreePriorities() throws Exception {
long maxSize = 100000;
long blockSize = calculateBlockSize(maxSize, 10);
@ -661,7 +660,6 @@ public class TestLruBlockCache {
// test setMaxSize
@Test
public void testResizeBlockCache() throws Exception {
long maxSize = 300000;
long blockSize = calculateBlockSize(maxSize, 31);
@ -684,7 +682,6 @@ public class TestLruBlockCache {
// Add all blocks from all priorities
for (int i = 0; i < 10; i++) {
// Just add single blocks
cache.cacheBlock(singleBlocks[i].cacheKey, singleBlocks[i]);