KYLIN-3164 HBase connection must be closed when clearing connection pool
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/3116abf1 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/3116abf1 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/3116abf1 Branch: refs/heads/sync Commit: 3116abf1ded94cdc30e59f4613b22ce3dc5337dd Parents: 120f9f3 Author: Li Yang <liy...@apache.org> Authored: Mon Jan 15 13:25:56 2018 +0800 Committer: Li Yang <liy...@apache.org> Committed: Fri Jan 26 18:53:19 2018 +0800 ---------------------------------------------------------------------- .../kylin/storage/hbase/HBaseConnection.java | 38 +++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/3116abf1/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java ---------------------------------------------------------------------- diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java index 16bd20d..0c2fb04 100644 --- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java +++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java @@ -20,8 +20,10 @@ package org.apache.kylin.storage.hbase; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -74,14 +76,11 @@ public class HBaseConnection { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { - closeCoprocessorPool(); - - for (Connection conn : connPool.values()) { - try { - conn.close(); - } catch (IOException e) { - logger.error("error closing hbase connection " + conn, e); - } + try { + closeCoprocessorPool(); + closeAndRestConnPool().join(); + } catch (InterruptedException e) { + logger.error("", e); } } }); @@ -128,9 +127,30 @@ public class HBaseConnection { coprocessorPool.shutdownNow(); } } + + private static Thread closeAndRestConnPool() { + final List<Connection> copy = new ArrayList<>(connPool.values()); + connPool.clear(); + + Thread t = new Thread() { + public void run() { + logger.info("Closing HBase connections..."); + for (Connection conn : copy) { + try { + conn.close(); + } catch (Exception e) { + logger.error("error closing hbase connection " + conn, e); + } + } + } + }; + t.setName("close-hbase-conn"); + t.start(); + return t; + } public static void clearConnCache() { - connPool.clear(); + closeAndRestConnPool(); } public static Configuration getCurrentHBaseConfiguration() {