HBASE-20698 (addendum) Master don't record right server version until new started region server call regionServerReport method
This commit is contained in:
parent
9d15e16946
commit
4d971d0f48
|
@ -1061,6 +1061,9 @@ public class ServerManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* May return 0 when server is not online.
|
||||||
|
*/
|
||||||
public int getServerVersion(final ServerName serverName) {
|
public int getServerVersion(final ServerName serverName) {
|
||||||
ServerMetrics serverMetrics = onlineServers.get(serverName);
|
ServerMetrics serverMetrics = onlineServers.get(serverName);
|
||||||
return serverMetrics != null ? serverMetrics.getVersionNumber() : 0;
|
return serverMetrics != null ? serverMetrics.getVersionNumber() : 0;
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
|
||||||
import org.apache.hadoop.hbase.master.MasterServices;
|
import org.apache.hadoop.hbase.master.MasterServices;
|
||||||
import org.apache.hadoop.hbase.master.ServerListener;
|
import org.apache.hadoop.hbase.master.ServerListener;
|
||||||
import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher;
|
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.hbase.util.EnvironmentEdgeManager;
|
||||||
import org.apache.hadoop.ipc.RemoteException;
|
import org.apache.hadoop.ipc.RemoteException;
|
||||||
import org.apache.yetus.audience.InterfaceAudience;
|
import org.apache.yetus.audience.InterfaceAudience;
|
||||||
|
@ -109,9 +110,11 @@ public class RSProcedureDispatcher
|
||||||
final Set<RemoteProcedure> remoteProcedures) {
|
final Set<RemoteProcedure> remoteProcedures) {
|
||||||
final int rsVersion = master.getServerManager().getServerVersion(serverName);
|
final int rsVersion = master.getServerManager().getServerVersion(serverName);
|
||||||
if (rsVersion >= RS_VERSION_WITH_EXEC_PROCS) {
|
if (rsVersion >= RS_VERSION_WITH_EXEC_PROCS) {
|
||||||
LOG.trace("Using procedure batch rpc execution for serverName={} version={}",
|
LOG.trace("Using procedure batch rpc execution for serverName={} version={}", serverName,
|
||||||
serverName, rsVersion);
|
rsVersion);
|
||||||
submitTask(new ExecuteProceduresRemoteCall(serverName, remoteProcedures));
|
submitTask(new ExecuteProceduresRemoteCall(serverName, remoteProcedures));
|
||||||
|
} else if (rsVersion == 0 && !master.getServerManager().isServerOnline(serverName)) {
|
||||||
|
submitTask(new DeadRSRemoteCall(serverName, remoteProcedures));
|
||||||
} else {
|
} else {
|
||||||
LOG.info(String.format(
|
LOG.info(String.format(
|
||||||
"Fallback to compat rpc execution for serverName=%s version=%s",
|
"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
|
// Compatibility calls
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
protected class ExecuteProceduresRemoteCall extends AbstractRSRemoteCall
|
protected class ExecuteProceduresRemoteCall extends AbstractRSRemoteCall
|
||||||
implements RemoteProcedureResolver {
|
implements RemoteProcedureResolver {
|
||||||
private final Set<RemoteProcedure> remoteProcedures;
|
protected final Set<RemoteProcedure> remoteProcedures;
|
||||||
|
|
||||||
private ExecuteProceduresRequest.Builder request = null;
|
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) {
|
for (RemoteProcedure proc : remoteProcedures) {
|
||||||
proc.remoteCallFailed(env, getServerName(), e);
|
proc.remoteCallFailed(env, getServerName(), e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue