Sergey Soldatov created HBASE-15957:
---------------------------------------
Summary: RpcClientImpl.close never ends in some circumstances
Key: HBASE-15957
URL: https://issues.apache.org/jira/browse/HBASE-15957
Project: HBase
Issue Type: Bug
Components: Client, rpc
Affects Versions: 1.1.2
Reporter: Sergey Soldatov
Assignee: Sergey Soldatov
This bug is related to HBASE-14241 and HBASE-13851.
Fix for HBASE-13851 introduced the check for non alive connections and if
connection is not alive, it close it:
{noformat}
if (!conn.isAlive()) {
if (connsToClose == null) {
connsToClose = new HashSet<Connection>();
}
connsToClose.add(conn);
}
....
if (connsToClose != null) {
for (Connection conn : connsToClose) {
if (conn.markClosed(new InterruptedIOException("RpcClient is
closing"))) {
conn.close();
}
}
}
{noformat}
That worked fine until fix for HBASE-14241 introduced handling for interrupt in
writer thread:
{noformat}
try {
cts = callsToWrite.take();
} catch (InterruptedException e) {
markClosed(new InterruptedIOException());
}
{noformat}
So, if writer thread is running, but connection thread is not started yet,
interrupt will cause calling of markClosed which will set shouldCloseConnection
flag for the parent connection. And the next time during the handling of non
alive connections markClosed will return false and close will not be called. As
the result connection will not be removed from the connections pool and
RpcClientImpl.close never finish.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)