From dd293c8ba97248f292667c52d7e95420611e3e22 Mon Sep 17 00:00:00 2001 From: Duo Zhang Date: Fri, 3 Sep 2021 17:07:30 +0800 Subject: [PATCH] HBASE-26230 Start an in process HRegionServer in maintenance mode (#3659) Signed-off-by: Yi Mei --- .../apache/hadoop/hbase/master/HMaster.java | 24 ++++++++++--------- .../hadoop/hbase/master/ServerManager.java | 3 ++- .../hbase/master/TestMasterNoCluster.java | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) 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 281580911bb..fed3d06a907 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.FutureUtils; 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 @@ public class HMaster extends HRegionServer implements MasterServices { */ @Override protected void waitForMasterActive() { - if (maintenanceMode) { - return; - } while (!isStopped() && !isAborted()) { sleeper.sleep(); } @@ -669,9 +670,6 @@ public class HMaster extends HRegionServer implements MasterServices { protected void configureInfoServer() { infoServer.addUnprivilegedServlet("master-status", "/master-status", MasterStatusServlet.class); infoServer.setAttribute(MASTER, this); - if (maintenanceMode) { - super.configureInfoServer(); - } } @Override @@ -966,6 +964,11 @@ public class HMaster extends HRegionServer implements MasterServices { // 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 @@ public class HMaster extends HRegionServer implements MasterServices { 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 class HMaster extends HRegionServer implements MasterServices { @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 e9b109859bc..0efedbcafaf 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 class ServerManager { */ 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 bc2bce90118..939ebe20f9f 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 class TestMasterNoCluster { 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);