PooledHTable多次close导致问题
PooledHTable close时,调用returnTable(table)
当对于同一个PooledHTable多次close时,
当tables.size(tableName) < maxSize时,
引用返回给了pool。
当tables.size(tableName) >= maxSize时,
代码执行到
this.tableFactory.releaseHTableInterface(table)
该HTable被close了。
由于多个引用指向同一个HTable。当后续从HTablePool取到该HTable时,由于该HTable已经关闭,调用时报错。
PooledHTable close时,调用returnTable(table)
private void returnTable(HTableInterface table) throws IOException {
// this is the old putTable method renamed and made private
String tableName = Bytes.toString(table.getTableName());
if (tables.size(tableName) >= maxSize) {
// release table instance since we're not reusing it
this.tables.remove(tableName, table);
this.tableFactory.releaseHTableInterface(table);
return;
}
tables.put(tableName, table);
}
当对于同一个PooledHTable多次close时,
当tables.size(tableName) < maxSize时,
引用返回给了pool。
当tables.size(tableName) >= maxSize时,
代码执行到
this.tableFactory.releaseHTableInterface(table)
public void close() throws IOException {
if (this.closed) {
return;
}
flushCommits();
if (cleanupPoolOnClose) {
this.pool.shutdown();
}
if (cleanupConnectionOnClose) {
if (this.connection != null) {
this.connection.close();
}
}
this.closed = true;
}
该HTable被close了。
由于多个引用指向同一个HTable。当后续从HTablePool取到该HTable时,由于该HTable已经关闭,调用时报错。