You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Ted Yu (JIRA)" <ji...@apache.org> on 2013/01/28 16:01:19 UTC

[jira] [Comment Edited] (HBASE-7685) Closing socket connection can't be removed from SecureClient

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

Ted Yu edited comment on HBASE-7685 at 1/28/13 3:01 PM:
--------------------------------------------------------

Thanks for your concern. There is a deep discussion about PoolMap in 6651. >From the discussion, I understand that there are risks when invoke put/get method concurrently. From source code of HBaseClient, I found that there are 'synchronized' protection when modifying connections as follows:
// code for get or create a connection
{code}
synchronized (connections) {
      connection = connections.get(remoteId);
      if (connection == null) {
        connection = createConnection(remoteId);
        connections.put(remoteId, connection);
      }
    }
{code}
// code for close connection
{code}
      synchronized (connections) {
        connections.remove(remoteId, this);
      }
{code}
                
      was (Author: cuijianwei):
    Thanks for your concern. There is a deep discussion about PoolMap in 6651. From the discussion, I understand that there are risks when invoke put/get method concurrently. From source code of HBaseClient, I found that there are 'synchronized' protection when modifying connections as follows:
// code for get or create a connection
{code}
synchronized (connections) {
      connection = connections.get(remoteId);
      if (connection == null) {
        connection = createConnection(remoteId);
        connections.put(remoteId, connection);
      }
    }
{code}
// code for close connection
      synchronized (connections) {
        connections.remove(remoteId, this);
      }
                  
> Closing socket connection can't be removed from SecureClient
> ------------------------------------------------------------
>
>                 Key: HBASE-7685
>                 URL: https://issues.apache.org/jira/browse/HBASE-7685
>             Project: HBase
>          Issue Type: Bug
>          Components: security
>    Affects Versions: 0.94.3
>            Reporter: cuijianwei
>         Attachments: closing_socket_connection_not_removed_in_secure_client.diff
>
>
> We found many IOExceptions naming "Call # not added as the connection # is closing" when using SecureClient to access hbase. From the source code of SecureClient, we found there may be bug in close() method of SecureClient. The following is the current logic in close() method of SecureClient:
> {code}
>       // release the resources
>       // first thing to do;take the connection out of the connection list
>       synchronized (connections) {
>         if (connections.get(remoteId) == this) {
>           connections.remove(remoteId);
>         }
>       }
> {code}
> However, connections are managed by PoolMap; therefore, if more than one connection are created for the same remoteId, the 'if condition' may not be satisfied because the default PoolType is RoundRobin. This could be cause a closing state connection can't be removed from connections, making new calls which use such connections will always throws IOException naming "connection is closing".
> We can use logic from close() method of HBaseClient to resolve the problem:
> {code}
>       // release the resources
>       // first thing to do;take the connection out of the connection list
>       synchronized (connections) {
>         connections.remove(remoteId, this);
>       }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira