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 281580911bb9..fed3d06a907a 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 @@ -215,6 +215,7 @@ import org.apache.hadoop.hbase.util.HBaseFsck; import org.apache.hadoop.hbase.util.HFileArchiveUtil; import org.apache.hadoop.hbase.util.IdLock; +import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.apache.hadoop.hbase.util.ModifyRegionUtils; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.RetryCounter; @@ -415,6 +416,9 @@ public class HMaster extends HRegionServer implements MasterServices { private final boolean maintenanceMode; static final String MAINTENANCE_MODE = "hbase.master.maintenance_mode"; + // the in process region server for carry system regions in maintenanceMode + private JVMClusterUtil.RegionServerThread maintenanceRegionServer; + // Cached clusterId on stand by masters to serve clusterID requests from clients. private final CachedClusterId cachedClusterId; @@ -623,9 +627,6 @@ protected void login(UserProvider user, String host) throws IOException { */ @Override protected void waitForMasterActive() { - if (maintenanceMode) { - return; - } while (!isStopped() && !isAborted()) { sleeper.sleep(); } @@ -669,9 +670,6 @@ protected RSRpcServices createRpcServices() throws IOException { protected void configureInfoServer() { infoServer.addUnprivilegedServlet("master-status", "/master-status", MasterStatusServlet.class); infoServer.setAttribute(MASTER, this); - if (maintenanceMode) { - super.configureInfoServer(); - } } @Override @@ -966,6 +964,11 @@ private void finishActiveMasterInitialization(MonitoredTask status) throws IOExc // initialize master side coprocessors before we start handling requests status.setStatus("Initializing master coprocessors"); this.cpHost = new MasterCoprocessorHost(this, this.conf); + } else { + // start an in process region server for carrying system regions + maintenanceRegionServer = + JVMClusterUtil.createRegionServerThread(getConfiguration(), HRegionServer.class, 0); + maintenanceRegionServer.start(); } // Checking if meta needs initializing. @@ -1553,9 +1556,11 @@ protected void stopServiceThreads() { cleanerPool.shutdownNow(); cleanerPool = null; } + if (maintenanceRegionServer != null) { + maintenanceRegionServer.getRegionServer().stop(HBASE_MASTER_CLEANER_INTERVAL); + } LOG.debug("Stopping service threads"); - // stop procedure executor prior to other services such as server manager and assignment // manager, as these services are important for some running procedures. See HBASE-24117 for // example. @@ -3873,10 +3878,7 @@ public SyncReplicationReplayWALManager getSyncReplicationReplayWALManager() { @Override public Map getWalGroupsReplicationStatus() { - if (!this.isOnline() || !maintenanceMode) { - return new HashMap<>(); - } - return super.getWalGroupsReplicationStatus(); + return new HashMap<>(); } public HbckChore getHbckChore() { 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 e9b109859bcc..0efedbcafafe 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 @@ -735,7 +735,8 @@ public static void closeRegionSilentlyAndWait(AsyncClusterConnection connection, */ private int getMinToStart() { if (master.isInMaintenanceMode()) { - // If in maintenance mode, then master hosting meta will be the only server available + // If in maintenance mode, then in process region server hosting meta will be the only server + // available return 1; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterNoCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterNoCluster.java index bc2bce901188..939ebe20f9ff 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterNoCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterNoCluster.java @@ -149,7 +149,7 @@ public void testMasterInitWithObserverModeClientZKQuorum() throws Exception { conf.set(HConstants.CLIENT_ZOOKEEPER_QUORUM, HConstants.LOCALHOST); conf.setInt(HConstants.CLIENT_ZOOKEEPER_CLIENT_PORT, TESTUTIL.getZkCluster().getClientPort() + 1); - // need to enable maintenance mode so we will start master as a region server + // need to enable maintenance mode so we will start master and an in process region server conf.setBoolean(HMaster.MAINTENANCE_MODE, true); // settings to allow us not to start additional RS conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, 1);