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);
       }

Reply via email to