HBASE-8360 In HBaseClient#cancelConnections we should close fully the connection

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1469952 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
nkeywal 2013-04-19 17:06:42 +00:00
parent efc32c83ba
commit e946c2871f
2 changed files with 11 additions and 6 deletions

View File

@ -26,6 +26,7 @@ import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -653,7 +654,8 @@ public class HConnectionManager {
@Override
public void newDead(ServerName sn) {
clearCaches(sn);
rpcEngine.getClient().cancelConnections(sn.getHostname(), sn.getPort(), null);
rpcEngine.getClient().cancelConnections(sn.getHostname(), sn.getPort(),
new SocketException(sn.getServerName() + " is dead: closing its connection."));
}
}, conf, listenerClass);
}

View File

@ -1370,11 +1370,14 @@ public class HBaseClient {
if (connection.isAlive() &&
connection.getRemoteAddress().getPort() == port &&
connection.getRemoteAddress().getHostName().equals(hostname)) {
LOG.info("The server on " + hostname + ":" + port +
" is dead - stopping the connection " + connection.remoteId);
connection.closeConnection();
// We could do a connection.interrupt(), but it's safer not to do it, as the
// interrupted exception behavior is not defined nor enforced enough.
if (connection.shouldCloseConnection.compareAndSet(false, true)) {
LOG.info("The server on " + hostname + ":" + port +
" is dead - closing the connection " + connection.remoteId);
connection.closeException = ioe;
connection.close();
// We could do a connection.interrupt(), but it's safer not to do it, as the
// interrupted exception behavior is not defined nor enforced enough.
}
}
}
}