diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index 2b7713b..7dc4b68 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -1240,8 +1240,7 @@ public class AssignmentManager { final boolean forceNewPlan) throws HBaseIOException { // Pickup existing plan or make a new one final String encodedName = region.getEncodedName(); - final List destServers = - serverManager.createDestinationServersList(); + final List destServers = serverManager.createDestinationServersList(); if (destServers.isEmpty()){ LOG.warn("Can't move " + encodedName + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java index 341d51c..4250025 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java @@ -198,6 +198,15 @@ public class ServerManager { /** Listeners that are called on server events. */ private List listeners = new CopyOnWriteArrayList(); + + /** + * Should master carry regions? + * This is the key to enable/disable. + */ + public static final String IS_MASTER_REGIONSERVER = "hbase.is.master.regionserver"; + public static final boolean IS_MASTER_REGIONSERVER_DEFAULT = true; + private final boolean masterIsRegionServer; + /** * Constructor. * @param master @@ -222,6 +231,8 @@ public class ServerManager { int pingSleepInterval = Math.max(1, master.getConfiguration().getInt( "hbase.master.ping.server.retry.sleep.interval", 100)); this.pingRetryCounterFactory = new RetryCounterFactory(pingMaxAttempts, pingSleepInterval); + this.masterIsRegionServer = services.getConfiguration(). + getBoolean(IS_MASTER_REGIONSERVER, IS_MASTER_REGIONSERVER_DEFAULT); } /** @@ -1114,6 +1125,9 @@ public class ServerManager { */ public List createDestinationServersList(final ServerName serverToExclude){ final List destServers = getOnlineServersList(); + if (!this.masterIsRegionServer) { + destServers.remove(this.master.getServerName()); + } if (serverToExclude != null){ destServers.remove(serverToExclude); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java index 6a28006..a1613e6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java @@ -981,6 +981,10 @@ public abstract class BaseLoadBalancer implements LoadBalancer { TableName.NAMESPACE_TABLE_NAME.getNameAsString(), TableName.META_TABLE_NAME.getNameAsString()}; + /** + * A String array of tables that can be balancer to the Master if it is configured to carry + * regions. + */ public static final String TABLES_ON_MASTER = "hbase.balancer.tablesOnMaster"; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterStartup.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterStartup.java index 8465db8..f50c8d9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterStartup.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterStartup.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.master; import static org.junit.Assert.assertTrue; +import java.io.IOException; import java.util.List; import org.apache.hadoop.hbase.CategoryBasedTimeout; @@ -44,20 +45,39 @@ public class TestMasterStartup { withLookingForStuckThread(true).build(); /** - * Test all comes up when no tables on master enabled. + * Test all comes up when regions on master and only master running. * @throws Exception */ @Test - public void testTablesOnMaster() throws Exception { + public void testRegionsOnMaster() throws Exception { final HBaseTestingUtility hbaseTestingUtility = new HBaseTestingUtility(); - hbaseTestingUtility.getConfiguration().setBoolean(BaseLoadBalancer.TABLES_ON_MASTER, true); - try (MiniHBaseCluster cluster = hbaseTestingUtility.startMiniCluster(3)) { - assertTrue(cluster.getMaster().isInitialized()); - ServerName serverName = cluster.getServerHoldingMeta(); - ServerName master = cluster.getMaster().getServerName(); - assertTrue("Master=" + master + ", metaServer=" + serverName, !master.equals(serverName)); - List descriptors = cluster.getMaster().listNamespaceDescriptors(); - assertTrue("descriptor=" + descriptors, descriptors.size() > 2); + // Bring up cluster with no regionservers + try (MiniHBaseCluster cluster = hbaseTestingUtility.startMiniCluster(1, 0, 1)) { + check(cluster, true); } } + + /** + * Test we fail if only master running and master is not to carry regions. + * @throws Exception + */ + @Test + public void testNoRegionsOnMaster() throws Exception { + final HBaseTestingUtility hbaseTestingUtility = new HBaseTestingUtility(); + hbaseTestingUtility.getConfiguration().setBoolean(ServerManager.IS_MASTER_REGIONSERVER, false); + // Bring up cluster with one regionserver + try (MiniHBaseCluster cluster = hbaseTestingUtility.startMiniCluster(1)) { + check(cluster, false); + } + } + + private void check(final MiniHBaseCluster cluster, final boolean same) throws IOException { + assertTrue(cluster.getMaster().isInitialized()); + ServerName serverName = cluster.getServerHoldingMeta(); + ServerName master = cluster.getMaster().getServerName(); + assertTrue("Master=" + master + ", metaServer=" + serverName, + master.equals(serverName) == same); + List descriptors = cluster.getMaster().getNamespaces(); + assertTrue("descriptor=" + descriptors, descriptors.size() >= 2); + } } \ No newline at end of file