Index: hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java (revision 1411321) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java (working copy) @@ -76,6 +76,7 @@ // TODO: Cleanup thread for Scanners, Scanner id wrap private final AtomicInteger nextScannerId = new AtomicInteger(0); private final Map scannerMap = new ConcurrentHashMap(); + private final Map tableMap = new ConcurrentHashMap(); public static THBaseService.Iface newInstance( Configuration conf, ThriftMetrics metrics) { @@ -128,11 +129,7 @@ } private void closeTable(HTableInterface table) throws TIOError { - try { - table.close(); - } catch (IOException e) { - throw getTIOError(e); - } + htablePool.putTable(table); } private TIOError getTIOError(IOException e) { @@ -169,7 +166,11 @@ * @param id of the Scanner to remove * @return the removed Scanner, or null if the Id is invalid */ - protected ResultScanner removeScanner(int id) { + protected ResultScanner removeScanner(int id) throws TIOError { + if(! scannerMap.containsKey(id)) + return null; + + closeTable(tableMap.remove(id)); return scannerMap.remove(id); } @@ -311,9 +312,12 @@ } catch (IOException e) { throw getTIOError(e); } finally { + if(resultScanner == null) closeTable(htable); } - return addScanner(resultScanner); + int id = addScanner(resultScanner); + tableMap.put(id, htable); + return id; } @Override @@ -342,3 +346,4 @@ } } +