Repository: hbase Updated Branches: refs/heads/master d7ddc7919 -> 3aadc675b
HBASE-17896 The FIXED_OVERHEAD of Segment is incorrect Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/3aadc675 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/3aadc675 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/3aadc675 Branch: refs/heads/master Commit: 3aadc675b0f02c3c13be625b40d72fbf6a844964 Parents: d7ddc79 Author: CHIA-PING TSAI <chia7...@gmail.com> Authored: Tue Apr 11 16:31:20 2017 +0800 Committer: Chia-Ping Tsai <chia7...@gmail.com> Committed: Wed Apr 12 11:26:43 2017 +0800 ---------------------------------------------------------------------- .../java/org/apache/hadoop/hbase/util/ClassSize.java | 7 +++++++ .../apache/hadoop/hbase/regionserver/Segment.java | 7 ++++--- .../org/apache/hadoop/hbase/io/TestHeapSize.java | 15 +++++++++------ 3 files changed, 20 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/3aadc675/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java ---------------------------------------------------------------------- diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java index 465bd9c..e1690c0 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java @@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.util; +import com.google.common.annotations.VisibleForTesting; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.concurrent.ConcurrentHashMap; @@ -235,6 +236,12 @@ public class ClassSize { } private static final MemoryLayout memoryLayout = getMemoryLayout(); + private static final boolean USE_UNSAFE_LAYOUT = (memoryLayout instanceof UnsafeLayout); + + @VisibleForTesting + public static boolean useUnsafeLayout() { + return USE_UNSAFE_LAYOUT; + } /** * Method for reading the arc settings and setting overheads according http://git-wip-us.apache.org/repos/asf/hbase/blob/3aadc675/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java index 6f431c9..8f43fa8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java @@ -48,12 +48,13 @@ import com.google.common.annotations.VisibleForTesting; @InterfaceAudience.Private public abstract class Segment { - final static long FIXED_OVERHEAD = ClassSize.align(ClassSize.OBJECT - + 5 * ClassSize.REFERENCE // cellSet, comparator, memStoreLAB, size, timeRangeTracker + public final static long FIXED_OVERHEAD = ClassSize.align(ClassSize.OBJECT + + 6 * ClassSize.REFERENCE // cellSet, comparator, memStoreLAB, dataSize, + // heapSize, and timeRangeTracker + Bytes.SIZEOF_LONG // minSequenceId + Bytes.SIZEOF_BOOLEAN); // tagsPresent public final static long DEEP_OVERHEAD = FIXED_OVERHEAD + ClassSize.ATOMIC_REFERENCE - + ClassSize.CELL_SET + ClassSize.ATOMIC_LONG + ClassSize.TIMERANGE_TRACKER; + + ClassSize.CELL_SET + 2 * ClassSize.ATOMIC_LONG + ClassSize.TIMERANGE_TRACKER; private AtomicReference<CellSet> cellSet= new AtomicReference<>(); private final CellComparator comparator; http://git-wip-us.apache.org/repos/asf/hbase/blob/3aadc675/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java ---------------------------------------------------------------------- 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 6b943a7..bf74a9e 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 @@ -344,7 +344,7 @@ public class TestHeapSize { cl = Segment.class; actual = Segment.DEEP_OVERHEAD; expected = ClassSize.estimateBase(cl, false); - expected += ClassSize.estimateBase(AtomicLong.class, false); + expected += 2 * ClassSize.estimateBase(AtomicLong.class, false); expected += ClassSize.estimateBase(AtomicReference.class, false); expected += ClassSize.estimateBase(CellSet.class, false); expected += ClassSize.estimateBase(TimeRangeTracker.class, false); @@ -361,7 +361,7 @@ public class TestHeapSize { cl = MutableSegment.class; actual = MutableSegment.DEEP_OVERHEAD; expected = ClassSize.estimateBase(cl, false); - expected += ClassSize.estimateBase(AtomicLong.class, false); + expected += 2 * ClassSize.estimateBase(AtomicLong.class, false); expected += ClassSize.estimateBase(AtomicReference.class, false); expected += ClassSize.estimateBase(CellSet.class, false); expected += ClassSize.estimateBase(TimeRangeTracker.class, false); @@ -380,7 +380,7 @@ public class TestHeapSize { cl = ImmutableSegment.class; actual = ImmutableSegment.DEEP_OVERHEAD_CSLM; expected = ClassSize.estimateBase(cl, false); - expected += ClassSize.estimateBase(AtomicLong.class, false); + expected += 2 * ClassSize.estimateBase(AtomicLong.class, false); expected += ClassSize.estimateBase(AtomicReference.class, false); expected += ClassSize.estimateBase(CellSet.class, false); expected += ClassSize.estimateBase(TimeRangeTracker.class, false); @@ -398,7 +398,7 @@ public class TestHeapSize { } actual = ImmutableSegment.DEEP_OVERHEAD_CAM; expected = ClassSize.estimateBase(cl, false); - expected += ClassSize.estimateBase(AtomicLong.class, false); + expected += 2 * ClassSize.estimateBase(AtomicLong.class, false); expected += ClassSize.estimateBase(AtomicReference.class, false); expected += ClassSize.estimateBase(CellSet.class, false); expected += ClassSize.estimateBase(TimeRangeTracker.class, false); @@ -504,8 +504,11 @@ public class TestHeapSize { } else { assertTrue(ClassSize.OBJECT == 12 || ClassSize.OBJECT == 16); // depending on CompressedOops } - assertEquals(ClassSize.OBJECT + 4, ClassSize.ARRAY); + if (ClassSize.useUnsafeLayout()) { + assertEquals(ClassSize.OBJECT + 4, ClassSize.ARRAY); + } else { + assertEquals(ClassSize.OBJECT + 8, ClassSize.ARRAY); + } } - }