diff --git service/src/java/org/apache/hive/service/cli/session/SessionManager.java service/src/java/org/apache/hive/service/cli/session/SessionManager.java index 15bab06..76e759f 100644 --- service/src/java/org/apache/hive/service/cli/session/SessionManager.java +++ service/src/java/org/apache/hive/service/cli/session/SessionManager.java @@ -185,14 +185,20 @@ public synchronized void start() { } } + 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(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 void run() { 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(