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

Igor Yurinok commented on HBASE-6956:
-------------------------------------

We implemented our own HTableFactory and HTable which able to check whether 
connection closed:
{code}
public class HumbleHTableFactory implements HTableInterfaceFactory {

    @Override
    public HTableInterface createHTableInterface(Configuration config, byte[] 
tableName) {
        try {
            return new HumbleHTable(config, tableName);
        } catch (IOException ioe) {
            throw new RuntimeException(ioe);
        }
    }

    @Override
    public void releaseHTableInterface(HTableInterface table) {
        try {
            table.close();
        } catch (IOException ioe) {
            throw new RuntimeException(ioe);
        }
    }

}
{code}
{code}
public class HumbleHTable extends HTable {

    private static final Log log = LogFactory.getLog(HumbleHTable.class);

    public HumbleHTable(String tableName) throws IOException {
        super(tableName);
    }

    public HumbleHTable(byte[] tableName) throws IOException {
        super(tableName);
    }

    public HumbleHTable(Configuration conf, String tableName) throws 
IOException {
        super(conf, tableName);
    }

    public HumbleHTable(Configuration conf, byte[] tableName) throws 
IOException {
        super(conf, tableName);
    }

    /**
     * Harmless clean-up - HConnection isn't touched. Only the executor pool is 
shut down
     *
     * @throws IOException
     */
    @Override
    public void close() throws IOException {
        if (isClosed()) {
            return;
        }
        flushCommits();
        ExecutorService pool = getPool();
        if (pool != null) {
            pool.shutdown();
        }
        setClosed();
    }

    private boolean isClosed() {
        try {
            return getSuperField("closed").getBoolean(this);
        } catch (Exception e) {
            log.error(e);
            return false;
        }
    }

    private void setClosed() {
        try {
            getSuperField("closed").setBoolean(this, true);
        } catch (Exception e) {
            log.error(e);
        }
    }

    private ExecutorService getPool() {
        try {
            return (ExecutorService) getSuperField("pool").get(this);
        } catch (Exception e) {
            log.error(e);
            return null;
        }
    }

    /**
     * Loads stuff from the parent class via reflection
     */
    private Field getSuperField(String fieldName) throws NoSuchFieldException {
        Field field = HTable.class.getDeclaredField(fieldName);
        field.setAccessible(true);
        return field;
    }

}
{code}
                
> Do not return back to HTablePool closed connections
> ---------------------------------------------------
>
>                 Key: HBASE-6956
>                 URL: https://issues.apache.org/jira/browse/HBASE-6956
>             Project: HBase
>          Issue Type: Bug
>          Components: Client
>    Affects Versions: 0.90.6
>            Reporter: Igor Yurinok
>
> Sometimes we see a lot of Exception about closed connections:
> {code}
>  
> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@553fd068
>  closed
> org.apache.hadoop.hbase.client.ClosedConnectionException: 
> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@553fd068
>  closed
> {code}
> After investigation we assumed that it occurs because closed connection 
> returns back into HTablePool. 
> For our opinion best solution is  check whether the table is closed in method 
> HTablePool.putTable and if true don't add it into the queue and release such 
> HTableInterface.
> But unfortunatly right now there are no access to HTable#closed field through 
> HTableInterface

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

Reply via email to