HIVE-14817. Shutdown the SessionManager timeoutChecker thread properly upon shutdown. (Siddharth Seth, reviewed by Thejas Nair)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/e08d94e5 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/e08d94e5 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/e08d94e5 Branch: refs/heads/hive-14535 Commit: e08d94e57d99245ebaa90c4be69dade84ba27172 Parents: 990927e Author: Siddharth Seth <[email protected]> Authored: Fri Sep 23 14:56:57 2016 -0700 Committer: Siddharth Seth <[email protected]> Committed: Fri Sep 23 14:56:57 2016 -0700 ---------------------------------------------------------------------- .../service/cli/session/SessionManager.java | 33 +++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/e08d94e5/service/src/java/org/apache/hive/service/cli/session/SessionManager.java ---------------------------------------------------------------------- diff --git a/service/src/java/org/apache/hive/service/cli/session/SessionManager.java b/service/src/java/org/apache/hive/service/cli/session/SessionManager.java index 15bab06..76e759f 100644 --- a/service/src/java/org/apache/hive/service/cli/session/SessionManager.java +++ b/service/src/java/org/apache/hive/service/cli/session/SessionManager.java @@ -185,14 +185,20 @@ public class SessionManager extends CompositeService { } } + private final Object timeoutCheckerLock = new Object(); + private void startTimeoutChecker() { final long interval = Math.max(checkInterval, 3000l); // minimum 3 seconds - Runnable timeoutChecker = new Runnable() { + final Runnable timeoutChecker = new Runnable() { @Override public void run() { - for (sleepInterval(interval); !shutdown; sleepInterval(interval)) { + sleepFor(interval); + while (!shutdown) { long current = System.currentTimeMillis(); for (HiveSession session : new ArrayList<HiveSession>(handleToSession.values())) { + if (shutdown) { + break; + } if (sessionTimeout > 0 && session.getLastAccessTime() + sessionTimeout <= current && (!checkOperation || session.getNoOperationTime() > sessionTimeout)) { SessionHandle handle = session.getSessionHandle(); @@ -207,24 +213,35 @@ public class SessionManager extends CompositeService { session.closeExpiredOperations(); } } + sleepFor(interval); } } - private void sleepInterval(long interval) { - try { - Thread.sleep(interval); - } catch (InterruptedException e) { - // ignore + private void sleepFor(long interval) { + synchronized (timeoutCheckerLock) { + try { + timeoutCheckerLock.wait(interval); + } catch (InterruptedException e) { + // Ignore, and break. + } } } }; backgroundOperationPool.execute(timeoutChecker); } + private void shutdownTimeoutChecker() { + shutdown = true; + synchronized (timeoutCheckerLock) { + timeoutCheckerLock.notify(); + } + } + + @Override public synchronized void stop() { super.stop(); - shutdown = true; + shutdownTimeoutChecker(); if (backgroundOperationPool != null) { backgroundOperationPool.shutdown(); long timeout = hiveConf.getTimeVar(
