HBASE-14431 AsyncRpcClient#removeConnection() never removes connection from connections pool if server fails (Samir Ahmic)
This commit is contained in:
parent
b0f5233265
commit
1545e1ed8d
|
@ -712,6 +712,21 @@ public class AsyncRpcChannel {
|
|||
public int getConnectionHashCode() {
|
||||
return ConnectionId.hashCode(ticket, serviceName, address);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getConnectionHashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof AsyncRpcChannel) {
|
||||
AsyncRpcChannel channel = (AsyncRpcChannel) obj;
|
||||
return channel.hashCode() == obj.hashCode();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
|
|
@ -398,12 +398,12 @@ public class AsyncRpcClient extends AbstractRpcClient {
|
|||
* Remove connection from pool
|
||||
*/
|
||||
public void removeConnection(AsyncRpcChannel connection) {
|
||||
int connectionHashCode = connection.getConnectionHashCode();
|
||||
int connectionHashCode = connection.hashCode();
|
||||
synchronized (connections) {
|
||||
// we use address as cache key, so we should check here to prevent removing the
|
||||
// wrong connection
|
||||
AsyncRpcChannel connectionInPool = this.connections.get(connectionHashCode);
|
||||
if (connectionInPool == connection) {
|
||||
if (connectionInPool.equals(connection)) {
|
||||
this.connections.remove(connectionHashCode);
|
||||
} else if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(String.format("%s already removed, expected instance %08x, actual %08x",
|
||||
|
|
Loading…
Reference in New Issue