[ 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)