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..2dc9bb0 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 @@ -26,13 +26,19 @@ import org.apache.hadoop.hbase.RegionLoad; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.coprocessor.BaseMasterAndRegionObserver; +import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; +import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.normalizer.NormalizationPlan.PlanType; +import java.io.IOException; 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. @@ -54,12 +60,13 @@ import java.util.List; * is by design to prevent normalization from undoing the pre-splitting of a table. */ @InterfaceAudience.Private -public class SimpleRegionNormalizer implements RegionNormalizer { +public class SimpleRegionNormalizer extends BaseMasterAndRegionObserver implements RegionNormalizer{ private static final Log LOG = LogFactory.getLog(SimpleRegionNormalizer.class); 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. @@ -80,6 +87,12 @@ public class SimpleRegionNormalizer implements RegionNormalizer { return skippedCount[type.ordinal()]; } + @Override + public void postDisableTable(final ObserverContext ctx, + final TableName tableName) throws IOException { + initialTableRegionCount.remove(tableName); + } + // Comparator that gives higher priority to region Split plan private Comparator planComparator = new Comparator() { @@ -112,6 +125,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 +170,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");