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