Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1331204) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -4607,13 +4607,12 @@ + " in table " + this.htableDescriptor); } } + + public static final long HREGION_CLASS_SIZE = ClassSize.OBJECT + + ClassSize.ARRAY + 31 * ClassSize.REFERENCE + Bytes.SIZEOF_INT + + (5 * Bytes.SIZEOF_LONG) + Bytes.SIZEOF_BOOLEAN; - public static final long FIXED_OVERHEAD = ClassSize.align( - ClassSize.OBJECT + - ClassSize.ARRAY + - 30 * ClassSize.REFERENCE + Bytes.SIZEOF_INT + - (6 * Bytes.SIZEOF_LONG) + - Bytes.SIZEOF_BOOLEAN); + public static final long FIXED_OVERHEAD = ClassSize.align(HREGION_CLASS_SIZE); public static final long DEEP_OVERHEAD = FIXED_OVERHEAD + ClassSize.OBJECT + // closeLock Index: src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java (revision 1331204) +++ src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java (working copy) @@ -338,9 +338,122 @@ // Sizing is quite accurate now, and our tests will throw errors if // any of these classes are modified without updating overhead sizes. } + + /** + * Test for {@link HRegion#FIXED_OVERHEAD}. + */ + public void testIncreaseHRegionFixedOverHead() { + @SuppressWarnings("rawtypes") + Class cl = null; + long expected = 0L; + long actual = 0L; + + cl = HRegionA.class; + actual = HRegionA.FIXED_OVERHEAD_A; + expected = ClassSize.estimateBase(cl, false); + if (expected != actual) { + ClassSize.estimateBase(cl, true); + assertEquals(expected, actual); + } + + cl = HRegionB.class; + actual = HRegionB.FIXED_OVERHEAD_B; + expected = ClassSize.estimateBase(cl, false); + if (expected != actual) { + ClassSize.estimateBase(cl, true); + assertEquals(expected, actual); + } + + cl = HRegionC.class; + actual = HRegionC.FIXED_OVERHEAD_C; + expected = ClassSize.estimateBase(cl, false); + if (expected != actual) { + ClassSize.estimateBase(cl, true); + assertEquals(expected, actual); + } + } + + /** + * New class used in testIncreaseHRegionFixedOverHead. + * Added 3 long variables. + */ + static class HRegionA extends HRegion { + private long newMemberVariable0 = 0L; + private long newMemberVariable1 = 0L; + private long newMemberVariable2 = 0L; + public static final long FIXED_OVERHEAD_A = ClassSize + .align(HRegion.HREGION_CLASS_SIZE + 3 * Bytes.SIZEOF_LONG); + public long getNewMemberVariable0() { + return newMemberVariable0; + } + + public long getNewMemberVariable1() { + return newMemberVariable1; + } + + public long getNewMemberVariable2() { + return newMemberVariable2; + } + } + + /** + * New class used in testIncreaseHRegionFixedOverHead. + * Added 2 references and 1 long variables. + */ + static class HRegionB extends HRegion { + private long newLong1 = 0L; + private Object newRef1 = 0L; + private Object newRef2 = 0L; + public static final long FIXED_OVERHEAD_B = ClassSize + .align(HRegion.HREGION_CLASS_SIZE + Bytes.SIZEOF_LONG + 2 + * ClassSize.REFERENCE); + + public long getNewLong1() { + return newLong1; + } + + public Object getNewRef1() { + return newRef1; + } + + public Object getNewRef2() { + return newRef2; + } + } + + /** + * New class used in testIncreaseHRegionFixedOverHead. + * Added 3 references variables. + */ + static class HRegionC extends HRegion { + private Object newLong1 = 0L; + private Object newRef1 = 0L; + private Object newRef2 = 0L; + private boolean newBoolean1 = false; + public static final long FIXED_OVERHEAD_C = ClassSize + .align(HRegion.HREGION_CLASS_SIZE + 3 * ClassSize.REFERENCE + + Bytes.SIZEOF_BOOLEAN); + + public Object getNewLong1() { + return newLong1; + } + + public Object getNewRef1() { + return newRef1; + } + + public Object getNewRef2() { + return newRef2; + } + + public boolean isNewBoolean1() { + return newBoolean1; + } + } + @org.junit.Rule public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu = new org.apache.hadoop.hbase.ResourceCheckerJUnitRule(); + } -