[ 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