From a6a5f03e5bd17aeab2063de8a24781466ed67275 Mon Sep 17 00:00:00 2001 From: Duo Zhang Date: Mon, 24 Oct 2022 10:27:33 +0800 Subject: [PATCH] HBASE-27437 TestHeapSize is flaky (#4841) Signed-off-by: GeorryHuang (cherry picked from commit dad9a7da9298b7f2f396826487d4133e78810895) Conflicts: hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java --- .../apache/hadoop/hbase/io/TestHeapSize.java | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java index a1f65141d943..38b093b997e3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java @@ -17,6 +17,8 @@ */ package org.apache.hadoop.hbase.io; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -25,13 +27,16 @@ import java.lang.management.RuntimeMXBean; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -601,18 +606,30 @@ public void testObjectSize() throws IOException { } } - @Test - public void testAutoCalcFixedOverHead() { - Class[] classList = new Class[] { HFileContext.class, HRegion.class, BlockCacheKey.class, - HFileBlock.class, HStore.class, LruBlockCache.class, StoreContext.class }; - for (Class cl : classList) { - // do estimate in advance to ensure class is loaded - ClassSize.estimateBase(cl, false); - - long startTime = System.currentTimeMillis(); - ClassSize.estimateBase(cl, false); - long endTime = System.currentTimeMillis(); - assertTrue(endTime - startTime < 5); + private long calcFixedOverhead(List> classList) { + long overhead = 0; + for (Class clazz : classList) { + overhead += ClassSize.estimateBase(clazz, false); } + return overhead; + } + + @Test + public void testAutoCalcFixedOverhead() throws InterruptedException { + List> classList = Arrays.asList(HFileContext.class, HRegion.class, BlockCacheKey.class, + HFileBlock.class, HStore.class, LruBlockCache.class, StoreContext.class); + for (int i = 0; i < 10; i++) { + // warm up + calcFixedOverhead(classList); + } + long startNs = System.nanoTime(); + long overhead = 0; + for (int i = 0; i < 100; i++) { + overhead += calcFixedOverhead(classList); + } + long costNs = System.nanoTime() - startNs; + LOG.info("overhead = {}, cost {} ns", overhead, costNs); + // the single computation cost should be less than 5ms + assertThat(costNs, lessThan(TimeUnit.MILLISECONDS.toNanos(5) * classList.size() * 100)); } }