[ 
https://issues.apache.org/jira/browse/HBASE-15957?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15314896#comment-15314896
 ] 

Enis Soztutar commented on HBASE-15957:
---------------------------------------

I think the idea with markClosed() is to make sure that the connection is 
closed only once. Only if you get true from markClosed() call, you should call 
close(). This assumes that if you get markClosed() to return true, in all 
cases, you should call close() yourself. But apparently it is not the case. 

> 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
>         Attachments: HBASE-15957.patch
>
>
> 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)

Reply via email to