diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index 7c9fd0c..b1f7471 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -1316,10 +1316,27 @@ public class AssignmentManager implements ServerListener { public void submitServerCrash(final ServerName serverName, final boolean shouldSplitWal) { boolean carryingMeta = isCarryingMeta(serverName); ProcedureExecutor procExec = this.master.getMasterProcedureExecutor(); - procExec.submitProcedure(new ServerCrashProcedure(procExec.getEnvironment(), serverName, - shouldSplitWal, carryingMeta)); - LOG.debug("Added=" + serverName + - " to dead servers, submitted shutdown handler to be executed meta=" + carryingMeta); + // HBASE-20976 + // Check whether there is already a SCP running for the ServerName + List previousSCPs = procExec.getProcedures().stream() + .filter(p -> p instanceof ServerCrashProcedure) + .map(p -> (ServerCrashProcedure) p) + .filter(p -> p.getServerName().equals(serverName) && + (p.isFinished() == false || p.isSuccess() == false)) + .collect(Collectors.toList()); + if (previousSCPs == null || previousSCPs.isEmpty()) { + procExec.submitProcedure( + new ServerCrashProcedure(procExec.getEnvironment(), serverName, + shouldSplitWal, carryingMeta)); + LOG.debug("Added=" + serverName + + " to dead servers, submitted shutdown handler to be executed meta=" + + carryingMeta); + } else { + LOG.debug("Skip to add SCP for " + serverName + + " with meta=" + + carryingMeta + " , since there are SCP(s) executing for it: " + previousSCPs); + } + } public void offlineRegion(final RegionInfo regionInfo) {