hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Igor Yurinok (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-6956) Do not return back to HTablePool closed connections
Date Fri, 30 Nov 2012 14:33:59 GMT

    [ 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

Mime
View raw message