HBASE-20698 (addendum) Master don't record right server version until new started region server call regionServerReport method
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/cc7aefe0 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/cc7aefe0 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/cc7aefe0 Branch: refs/heads/HBASE-19064 Commit: cc7aefe0bb238712eed1461c792285311259d8aa Parents: 5fd16f3 Author: Guanghao Zhang <zg...@apache.org> Authored: Sat Jun 9 20:42:23 2018 +0800 Committer: Guanghao Zhang <zg...@apache.org> Committed: Sun Jun 10 08:23:28 2018 +0800 ---------------------------------------------------------------------- .../hadoop/hbase/master/ServerManager.java | 3 +++ .../master/procedure/RSProcedureDispatcher.java | 25 ++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/cc7aefe0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java ---------------------------------------------------------------------- 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 b2a6a72..86e5530 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 @@ -1061,6 +1061,9 @@ public class ServerManager { } } + /** + * May return 0 when server is not online. + */ public int getServerVersion(final ServerName serverName) { ServerMetrics serverMetrics = onlineServers.get(serverName); return serverMetrics != null ? serverMetrics.getVersionNumber() : 0; http://git-wip-us.apache.org/repos/asf/hbase/blob/cc7aefe0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java ---------------------------------------------------------------------- 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 5693952..c682fa2 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.procedure2.RemoteProcedureDispatcher; +import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.ipc.RemoteException; import org.apache.yetus.audience.InterfaceAudience; @@ -109,9 +110,11 @@ public class RSProcedureDispatcher final Set<RemoteProcedure> remoteProcedures) { final int rsVersion = master.getServerManager().getServerVersion(serverName); if (rsVersion >= RS_VERSION_WITH_EXEC_PROCS) { - LOG.trace("Using procedure batch rpc execution for serverName={} version={}", - serverName, rsVersion); + LOG.trace("Using procedure batch rpc execution for serverName={} version={}", serverName, + rsVersion); submitTask(new ExecuteProceduresRemoteCall(serverName, remoteProcedures)); + } else if (rsVersion == 0 && !master.getServerManager().isServerOnline(serverName)) { + submitTask(new DeadRSRemoteCall(serverName, remoteProcedures)); } else { LOG.info(String.format( "Fallback to compat rpc execution for serverName=%s version=%s", @@ -270,12 +273,26 @@ public class RSProcedureDispatcher } } + private class DeadRSRemoteCall extends ExecuteProceduresRemoteCall { + + public DeadRSRemoteCall(ServerName serverName, Set<RemoteProcedure> remoteProcedures) { + super(serverName, remoteProcedures); + } + + @Override + public Void call() { + remoteCallFailed(procedureEnv, + new RegionServerStoppedException("Server " + getServerName() + " is not online")); + return null; + } + } + // ========================================================================== // Compatibility calls // ========================================================================== protected class ExecuteProceduresRemoteCall extends AbstractRSRemoteCall implements RemoteProcedureResolver { - private final Set<RemoteProcedure> remoteProcedures; + protected final Set<RemoteProcedure> remoteProcedures; private ExecuteProceduresRequest.Builder request = null; @@ -334,7 +351,7 @@ public class RSProcedureDispatcher } } - private void remoteCallFailed(final MasterProcedureEnv env, final IOException e) { + protected void remoteCallFailed(final MasterProcedureEnv env, final IOException e) { for (RemoteProcedure proc : remoteProcedures) { proc.remoteCallFailed(env, getServerName(), e); }