diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index bdb19f4..e597a2a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -92,9 +92,11 @@ import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory; import org.apache.hadoop.hbase.master.cleaner.HFileCleaner; import org.apache.hadoop.hbase.master.cleaner.LogCleaner; import org.apache.hadoop.hbase.master.handler.DispatchMergingRegionHandler; +import org.apache.hadoop.hbase.master.normalizer.NormalizationPlan; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizer; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerChore; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerFactory; +import org.apache.hadoop.hbase.master.normalizer.SplitNormalizationPlan; import org.apache.hadoop.hbase.master.procedure.AddColumnFamilyProcedure; import org.apache.hadoop.hbase.master.procedure.CreateNamespaceProcedure; import org.apache.hadoop.hbase.master.procedure.CreateTableProcedure; @@ -124,6 +126,7 @@ import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoRespo import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionServerInfo; import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos.SplitLogTask.RecoveryMode; import org.apache.hadoop.hbase.quotas.MasterQuotaManager; +import org.apache.hadoop.hbase.quotas.QuotaExceededException; import org.apache.hadoop.hbase.quotas.RegionStateListener; import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine; import org.apache.hadoop.hbase.regionserver.HRegionServer; @@ -1353,10 +1356,11 @@ public class HMaster extends HRegionServer implements MasterServices, Server { Collections.shuffle(allEnabledTables); for (TableName table : allEnabledTables) { + boolean checkQuota = false; if (quotaManager.getNamespaceQuotaManager() != null && + quotaManager.isQuotaEnabled() && quotaManager.getNamespaceQuotaManager().getState(table.getNamespaceAsString()) != null){ - LOG.debug("Skipping normalizing " + table + " since its namespace has quota"); - continue; + checkQuota = true; } TableDescriptor tblDesc = getTableDescriptors().getDescriptor(table); if (table.isSystemTable() || (tblDesc != null && @@ -1366,7 +1370,17 @@ public class HMaster extends HRegionServer implements MasterServices, Server { + " table or doesn't have auto normalization turned on"); continue; } - this.normalizer.computePlanForTable(table).execute(clusterConnection.getAdmin()); + NormalizationPlan plan = this.normalizer.computePlanForTable(table); + if (checkQuota && plan instanceof SplitNormalizationPlan) { + HRegionInfo hri = ((SplitNormalizationPlan) plan).getRegionInfo(); + try { + quotaManager.getNamespaceQuotaManager().checkQuotaToSplitRegion(hri); + } catch (QuotaExceededException qee) { + LOG.debug("Skipping normalization for " + hri + ", as quota would be exceeded"); + continue; + } + } + plan.execute(clusterConnection.getAdmin()); } } // If Region did not generate any plans, it means the cluster is already balanced. diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizerOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizerOnCluster.java index d24023d..c26d09a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizerOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizerOnCluster.java @@ -30,6 +30,8 @@ import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.namespace.TestNamespaceAuditor; +import org.apache.hadoop.hbase.quotas.QuotaUtil; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.testclassification.MasterTests; @@ -63,9 +65,11 @@ public class TestSimpleRegionNormalizerOnCluster { // we will retry operations when PleaseHoldException is thrown TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 3); TEST_UTIL.getConfiguration().setBoolean(HConstants.HBASE_NORMALIZER_ENABLED, true); + TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true); // Start a cluster of two regionservers. TEST_UTIL.startMiniCluster(1); + TestNamespaceAuditor.waitForQuotaEnabled(TEST_UTIL); admin = TEST_UTIL.getHBaseAdmin(); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java index 7ded3d3..e3b841b 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java @@ -115,7 +115,7 @@ public class TestNamespaceAuditor { conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class, RegionServerObserver.class); UTIL.startMiniCluster(1, 1); - waitForQuotaEnabled(); + waitForQuotaEnabled(UTIL); ADMIN = UTIL.getHBaseAdmin(); } @@ -620,11 +620,11 @@ public class TestNamespaceAuditor { .getTables().size(), after.getTables().size()); } - private static void waitForQuotaEnabled() throws Exception { - UTIL.waitFor(60000, new Waiter.Predicate() { + public static void waitForQuotaEnabled(final HBaseTestingUtility util) throws Exception { + util.waitFor(60000, new Waiter.Predicate() { @Override public boolean evaluate() throws Exception { - HMaster master = UTIL.getHBaseCluster().getMaster(); + HMaster master = util.getHBaseCluster().getMaster(); if (master == null) { return false; } @@ -638,7 +638,7 @@ public class TestNamespaceAuditor { UTIL.getHBaseCluster().getMaster(0).stop("Stopping to start again"); UTIL.getHBaseCluster().waitOnMaster(0); UTIL.getHBaseCluster().startMaster(); - waitForQuotaEnabled(); + waitForQuotaEnabled(UTIL); } private NamespaceAuditor getQuotaManager() {