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

cuijianwei commented on HBASE-10396:
------------------------------------

Thanks for your advice [~zjushch], I think moving trunk code of HBaseAdmin to 
0.94 is a better choice. In patch 0.94-v1, HBaseAdmin might get a new 
HConnection only when all the other threads deleted the shared HConnection, 
which is not good enough. The trunk code of HBaseAdmin is:
{code}
public HBaseAdmin(Configuration c)
  throws MasterNotRunningException, ZooKeeperConnectionException, IOException {
    // Will not leak connections, as the new implementation of the constructor
    // does not throw exceptions anymore.
    this(HConnectionManager.getConnection(new Configuration(c)));
    this.cleanupConnectionOnClose = true;
  }

public HBaseAdmin(HConnection connection)
  throws MasterNotRunningException, ZooKeeperConnectionException {
    ....
  }
{code}
The constructs of HBaseAdmin in trunk will not throw exceptions. However, in 
0.94, HConnection#getMaster will throw exceptions in constructor which might 
cause Hconnection leak. Therefore, the second patch will not invoke 
HConnection#getMaster in HBaseAdmin. Then, HConnection#getMaster will be 
invoked when really needing to connect to master.

> The constructor of HBaseAdmin may close the shared HConnection 
> ---------------------------------------------------------------
>
>                 Key: HBASE-10396
>                 URL: https://issues.apache.org/jira/browse/HBASE-10396
>             Project: HBase
>          Issue Type: Bug
>          Components: Admin, Client
>    Affects Versions: 0.94.16
>            Reporter: cuijianwei
>         Attachments: HBASE-10396-0.94-v1.patch, HBASE-10396-0.94-v2.patch
>
>
> HBaseAdmin has the constructor:
> {code}
>   public HBaseAdmin(Configuration c)
>   throws MasterNotRunningException, ZooKeeperConnectionException {
>     this.conf = HBaseConfiguration.create(c);
>     this.connection = HConnectionManager.getConnection(this.conf);
>     ...
> {code}
> As shown in above code, HBaseAdmin will get a cached HConnection or create a 
> new HConnection and use this HConnection to connect to Master. Then, 
> HBaseAdmin will delete the HConnection when connecting to master fail as 
> follows:
> {code}
>     while ( true ){
>       try {
>         this.connection.getMaster();
>         return;
>       } catch (MasterNotRunningException mnre) {
>         HConnectionManager.deleteStaleConnection(this.connection);
>         this.connection = HConnectionManager.getConnection(this.conf);
>       }
> {code} 
> The above code will invoke HConnectionManager#deleteStaleConnection to delete 
> the HConnection from global HConnection cache. The risk is that the deleted 
> HConnection might be sharing by other threads, such as HTable or HTablePool. 
> Then, these threads which sharing the deleted HConnection will get closed 
> HConnection exception:
> {code}
> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@61bc59aa
>  closed
> {code}
> If users use HTablePool, the situation will become worse because closing 
> HTable will only return HTable to HTablePool which won't reduce the reference 
> count of the closed HConnection. Then, the closed HConnection will always be 
> used before clearing HTablePool. In 0.94, some modules such as Rest server 
> are using HTablePool, therefore may suffer from this problem. 



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to