diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java index a99f8dd..04eb284 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java @@ -32,7 +32,9 @@ import org.apache.hadoop.hbase.master.normalizer.NormalizationPlan.PlanType; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Simple implementation of region normalizer. @@ -60,6 +62,7 @@ public class SimpleRegionNormalizer implements RegionNormalizer { private static final int MIN_REGION_COUNT = 3; private MasterServices masterServices; private static long[] skippedCount = new long[NormalizationPlan.PlanType.values().length]; + private static Map initialTableRegionCount = new HashMap<>(); /** * Set the master service. @@ -112,6 +115,10 @@ public class SimpleRegionNormalizer implements RegionNormalizer { List plans = new ArrayList(); List tableRegions = masterServices.getAssignmentManager().getRegionStates(). getRegionsOfTable(table); + if (!initialTableRegionCount.containsKey(table) && tableRegions != null) { + // record initial region count + initialTableRegionCount.put(table, tableRegions.size()); + } //TODO: should we make min number of regions a config param? if (tableRegions == null || tableRegions.size() < MIN_REGION_COUNT) { @@ -153,7 +160,8 @@ public class SimpleRegionNormalizer implements RegionNormalizer { } HRegionInfo hri2 = tableRegions.get(candidateIdx+1); long regionSize2 = getRegionSize(hri2); - if (regionSize + regionSize2 < avgRegionSize) { + if (tableRegions.size() >= initialTableRegionCount.get(table) && + regionSize + regionSize2 < avgRegionSize) { LOG.info("Table " + table + ", small region size: " + regionSize + " plus its neighbor size: " + regionSize2 + ", less than the avg size " + avgRegionSize + ", merging them");