diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java index dbd555c..c25975c 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java @@ -22,6 +22,7 @@ import java.io.Closeable; import java.io.IOException; import java.io.InterruptedIOException; import java.lang.reflect.UndeclaredThrowableException; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; @@ -169,6 +170,7 @@ import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.UnassignRegionRes import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.UserProvider; +import org.apache.hadoop.hbase.util.Addressing; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.ExceptionUtil; @@ -1460,7 +1462,8 @@ final class ConnectionManager { throw new MasterNotRunningException(sn + " is dead."); } // Use the security info interface name as our stub key - String key = getStubKey(getServiceName(), sn.getHostAndPort()); + String key = getStubKey(getServiceName(), Addressing.parseHostname(sn.getHostAndPort()), + Addressing.parsePort(sn.getHostAndPort())); connectionLock.putIfAbsent(key, key); Object stub = null; synchronized (connectionLock.get(key)) { @@ -1549,7 +1552,8 @@ final class ConnectionManager { throw new RegionServerStoppedException(serverName + " is dead."); } String key = getStubKey(AdminService.BlockingInterface.class.getName(), - serverName.getHostAndPort()); + Addressing.parseHostname(serverName.getHostAndPort()), + Addressing.parsePort(serverName.getHostAndPort())); this.connectionLock.putIfAbsent(key, key); AdminService.BlockingInterface stub = null; synchronized (this.connectionLock.get(key)) { @@ -1570,7 +1574,8 @@ final class ConnectionManager { if (isDeadServer(sn)) { throw new RegionServerStoppedException(sn + " is dead."); } - String key = getStubKey(ClientService.BlockingInterface.class.getName(), sn.getHostAndPort()); + String key = getStubKey(ClientService.BlockingInterface.class.getName(), + Addressing.parseHostname(sn.getHostAndPort()), Addressing.parsePort(sn.getHostAndPort())); this.connectionLock.putIfAbsent(key, key); ClientService.BlockingInterface stub = null; synchronized (this.connectionLock.get(key)) { @@ -1587,8 +1592,14 @@ final class ConnectionManager { return stub; } - static String getStubKey(final String serviceName, final String rsHostnamePort) { - return serviceName + "@" + rsHostnamePort; + static String getStubKey(final String serviceName, final String rsHostname, int port) { + // Sometimes, servers go down and they come back up with the same hostname but a different + // IP address. Force a resolution of the rsHostname by trying to instantiate an + // InetSocketAddress, and this way we will rightfully get a new stubKey. + String str = serviceName + "@" + + new InetSocketAddress(rsHostname, port).getAddress().getHostAddress() + + ":" + port; + return str; } private ZooKeeperKeepAliveConnection keepAliveZookeeper;