cuijianwei created HBASE-10396:
----------------------------------
Summary: 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
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 into 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)