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 970cda8cb44..232b3abd00b 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 @@ -2751,6 +2751,7 @@ public class HMaster extends HRegionServer implements MasterServices { @Override public void abort(String reason, Throwable cause) { if (isAborted() || isStopped()) { + LOG.debug("Abort called but aborted={}, stopped={}", isAborted(), isStopped()); return; } setAbortRequested(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java index 10b823ca673..ea5a16565bb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java @@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.ServerListener; import org.apache.hadoop.hbase.master.ServerManager; +import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher; import org.apache.hadoop.hbase.regionserver.RegionServerAbortedException; import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; @@ -95,10 +96,24 @@ public class RSProcedureDispatcher return false; } // Around startup, if failed, some of the below may be set back to null so NPE is possible. + ServerManager sm = master.getServerManager(); + if (sm == null) { + LOG.debug("ServerManager is null; stopping={}", master.isStopping()); + return false; + } + sm.registerListener(this); + ProcedureExecutor pe = master.getMasterProcedureExecutor(); + if (pe == null) { + LOG.debug("ProcedureExecutor is null; stopping={}", master.isStopping()); + return false; + } + procedureEnv = pe.getEnvironment(); + if (this.procedureEnv == null) { + LOG.debug("ProcedureEnv is null; stopping={}", master.isStopping()); + return false; + } try { - master.getServerManager().registerListener(this); - procedureEnv = master.getMasterProcedureExecutor().getEnvironment(); - for (ServerName serverName : master.getServerManager().getOnlineServersList()) { + for (ServerName serverName : sm.getOnlineServersList()) { addNode(serverName); } } catch (Exception e) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterShutdown.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterShutdown.java index a5e596f79d7..4dc626214ac 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterShutdown.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterShutdown.java @@ -168,7 +168,8 @@ public class TestMasterShutdown { final long timeout = TimeUnit.MINUTES.toMillis(10); assertNotEquals("timeout waiting for server manager to become available.", -1, Waiter.waitFor(htu.getConfiguration(), timeout, - () -> masterThread.getMaster().getServerManager() != null)); + () -> masterThread.getMaster().getServerManager() != null && + !masterThread.getMaster().isStopping())); // Master has come up far enough that we can terminate it without creating a zombie. final long result = Waiter.waitFor(htu.getConfiguration(), timeout, 500, () -> {