HIVE-14739: Replace runnables directly added to runtime shutdown hooks to avoid deadlock (Prasanth Jayachandran reviewed by Chris Nauroth, Siddharth Seth)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/ff67cdda Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/ff67cdda Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/ff67cdda Branch: refs/heads/hive-14535 Commit: ff67cdda1c538dc65087878eeba3e165cf3230f4 Parents: 5c5a6a9 Author: Prasanth Jayachandran <prasan...@apache.org> Authored: Tue Sep 13 15:06:55 2016 -0700 Committer: Prasanth Jayachandran <prasan...@apache.org> Committed: Tue Sep 13 15:06:55 2016 -0700 ---------------------------------------------------------------------- .../java/org/apache/hive/beeline/BeeLine.java | 5 +- .../org/apache/hadoop/hive/cli/CliDriver.java | 5 +- .../hive/common/util/ShutdownHookManager.java | 171 +++---------------- .../common/util/TestShutdownHookManager.java | 35 ---- .../hive/hcatalog/common/HiveClientCache.java | 3 +- .../hadoop/hive/metastore/HiveMetaStore.java | 3 +- .../hive/ql/exec/mr/HadoopJobExecHelper.java | 3 +- .../spark/session/SparkSessionManagerImpl.java | 3 +- .../hadoop/hive/ql/exec/tez/TezJobMonitor.java | 3 +- .../apache/hadoop/hive/ql/hooks/ATSHook.java | 3 +- .../zookeeper/CuratorFrameworkSingleton.java | 3 +- .../apache/hive/service/server/HiveServer2.java | 3 +- 12 files changed, 43 insertions(+), 197 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/beeline/src/java/org/apache/hive/beeline/BeeLine.java ---------------------------------------------------------------------- diff --git a/beeline/src/java/org/apache/hive/beeline/BeeLine.java b/beeline/src/java/org/apache/hive/beeline/BeeLine.java index ecd60f6..5322ca6 100644 --- a/beeline/src/java/org/apache/hive/beeline/BeeLine.java +++ b/beeline/src/java/org/apache/hive/beeline/BeeLine.java @@ -92,6 +92,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.io.IOUtils; import org.apache.hive.beeline.cli.CliOptionsProcessor; +import org.apache.hive.common.util.ShutdownHookManager; import org.apache.thrift.transport.TTransportException; import org.apache.hive.jdbc.Utils; @@ -1076,7 +1077,7 @@ public class BeeLine implements Closeable { } // add shutdown hook to flush the history to history file - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { History h = consoleReader.getHistory(); @@ -1088,7 +1089,7 @@ public class BeeLine implements Closeable { } } } - })); + }); consoleReader.addCompleter(new BeeLineCompleter(this)); return consoleReader; http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java ---------------------------------------------------------------------- diff --git a/cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java b/cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java index 874e5aa..5364ca6 100644 --- a/cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java +++ b/cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java @@ -79,6 +79,7 @@ import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.ql.session.SessionState.LogHelper; import org.apache.hadoop.io.IOUtils; +import org.apache.hive.common.util.ShutdownHookManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -808,7 +809,7 @@ public class CliDriver { } // add shutdown hook to flush the history to history file - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { History h = reader.getHistory(); @@ -820,7 +821,7 @@ public class CliDriver { } } } - })); + }); } protected void setupConsoleReader() throws IOException { http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java ---------------------------------------------------------------------- diff --git a/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java b/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java index 5efeda9..6585e3b 100644 --- a/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java +++ b/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java @@ -18,131 +18,37 @@ package org.apache.hive.common.util; -import com.google.common.annotations.VisibleForTesting; - import java.io.File; -import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.HashSet; -import java.util.List; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.hadoop.fs.FileSystem; + +import com.google.common.annotations.VisibleForTesting; /** - * The <code>ShutdownHookManager</code> enables running shutdownHook - * in a deterministic order, higher priority first. - * <p/> - * The JVM runs ShutdownHooks in a non-deterministic order or in parallel. - * This class registers a single JVM shutdownHook and run all the - * shutdownHooks registered to it (to this class) in order based on their - * priority. - * - * Originally taken from o.a.hadoop.util.ShutdownHookManager + * This is just a wrapper around hadoop's ShutdownHookManager but also manages delete on exit hook for temp files. */ public class ShutdownHookManager { - private static final ShutdownHookManager MGR = new ShutdownHookManager(); + private static final org.apache.hadoop.util.ShutdownHookManager MGR = org.apache.hadoop.util.ShutdownHookManager.get(); private static final DeleteOnExitHook DELETE_ON_EXIT_HOOK = new DeleteOnExitHook(); - private static final Logger LOG = LoggerFactory.getLogger(ShutdownHookManager.class); - static { - MGR.addShutdownHookInternal(DELETE_ON_EXIT_HOOK, -1); - Runtime.getRuntime().addShutdownHook( - new Thread() { - @Override - public void run() { - MGR.shutdownInProgress.set(true); - for (Runnable hook : getShutdownHooksInOrder()) { - try { - hook.run(); - } catch (Throwable ex) { - LOG.warn("ShutdownHook '" + hook.getClass().getSimpleName() + - "' failed, " + ex.toString(), ex); - } - } - } - } - ); + MGR.addShutdownHook(DELETE_ON_EXIT_HOOK, -1); } - /** - * Private structure to store ShutdownHook and its priority. + * Adds shutdown hook with default priority (10) + * @param shutdownHook - shutdown hook */ - private static class HookEntry { - Runnable hook; - int priority; - - public HookEntry(Runnable hook, int priority) { - this.hook = hook; - this.priority = priority; - } - - @Override - public int hashCode() { - return hook.hashCode(); - } - - @Override - public boolean equals(Object obj) { - boolean eq = false; - if (obj != null) { - if (obj instanceof HookEntry) { - eq = (hook == ((HookEntry)obj).hook); - } - } - return eq; - } - - } - - private final Set<HookEntry> hooks = - Collections.synchronizedSet(new HashSet<HookEntry>()); - - private final AtomicBoolean shutdownInProgress = new AtomicBoolean(false); - - //private to constructor to ensure singularity - private ShutdownHookManager() { + public static void addShutdownHook(Runnable shutdownHook) { + addShutdownHook(shutdownHook, FileSystem.SHUTDOWN_HOOK_PRIORITY); } /** - * Returns the list of shutdownHooks in order of execution, - * Highest priority first. - * - * @return the list of shutdownHooks in order of execution. - */ - static List<Runnable> getShutdownHooksInOrder() { - return MGR.getShutdownHooksInOrderInternal(); - } - - private List<Runnable> getShutdownHooksInOrderInternal() { - List<HookEntry> list; - synchronized (MGR.hooks) { - list = new ArrayList<HookEntry>(MGR.hooks); - } - Collections.sort(list, new Comparator<HookEntry>() { - - //reversing comparison so highest priority hooks are first - @Override - public int compare(HookEntry o1, HookEntry o2) { - return o2.priority - o1.priority; - } - }); - List<Runnable> ordered = new ArrayList<Runnable>(); - for (HookEntry entry: list) { - ordered.add(entry.hook); - } - return ordered; - } - - - /** * Adds a shutdownHook with a priority, the higher the priority * the earlier will run. ShutdownHooks with same priority run * in a non-deterministic order. @@ -154,17 +60,16 @@ public class ShutdownHookManager { if (priority < 0) { throw new IllegalArgumentException("Priority should be greater than or equal to zero"); } - MGR.addShutdownHookInternal(shutdownHook, priority); + MGR.addShutdownHook(shutdownHook, priority); } - private void addShutdownHookInternal(Runnable shutdownHook, int priority) { - if (shutdownHook == null) { - throw new IllegalArgumentException("shutdownHook cannot be NULL"); - } - if (shutdownInProgress.get()) { - throw new IllegalStateException("Shutdown in progress, cannot add a shutdownHook"); - } - hooks.add(new HookEntry(shutdownHook, priority)); + /** + * Indicates if shutdown is in progress or not. + * + * @return TRUE if the shutdown is in progress, otherwise FALSE. + */ + public static boolean isShutdownInProgress() { + return MGR.isShutdownInProgress(); } /** @@ -178,41 +83,7 @@ public class ShutdownHookManager { if (shutdownHook == null) { return false; } - return MGR.removeShutdownHookInternal(shutdownHook); - } - - private boolean removeShutdownHookInternal(Runnable shutdownHook) { - if (shutdownInProgress.get()) { - throw new IllegalStateException("Shutdown in progress, cannot remove a shutdownHook"); - } - return hooks.remove(new HookEntry(shutdownHook, 0)); - } - - /** - * Indicates if a shutdownHook is registered or not. - * - * @param shutdownHook shutdownHook to check if registered. - * @return TRUE/FALSE depending if the shutdownHook is is registered. - */ - public static boolean hasShutdownHook(Runnable shutdownHook) { - return MGR.hasShutdownHookInternal(shutdownHook); - } - - public boolean hasShutdownHookInternal(Runnable shutdownHook) { - return hooks.contains(new HookEntry(shutdownHook, 0)); - } - - /** - * Indicates if shutdown is in progress or not. - * - * @return TRUE if the shutdown is in progress, otherwise FALSE. - */ - public static boolean isShutdownInProgress() { - return MGR.isShutdownInProgressInternal(); - } - - private boolean isShutdownInProgressInternal() { - return shutdownInProgress.get(); + return MGR.removeShutdownHook(shutdownHook); } /** @@ -221,7 +92,7 @@ public class ShutdownHookManager { * @see {@link org.apache.hadoop.hive.common.FileUtils#createTempFile} */ public static void deleteOnExit(File file) { - if (isShutdownInProgress()) { + if (MGR.isShutdownInProgress()) { throw new IllegalStateException("Shutdown in progress, cannot add a deleteOnExit"); } DELETE_ON_EXIT_HOOK.deleteTargets.add(file); @@ -231,7 +102,7 @@ public class ShutdownHookManager { * deregister file from delete-on-exit hook */ public static void cancelDeleteOnExit(File file) { - if (isShutdownInProgress()) { + if (MGR.isShutdownInProgress()) { throw new IllegalStateException("Shutdown in progress, cannot cancel a deleteOnExit"); } DELETE_ON_EXIT_HOOK.deleteTargets.remove(file); http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/common/src/test/org/apache/hive/common/util/TestShutdownHookManager.java ---------------------------------------------------------------------- diff --git a/common/src/test/org/apache/hive/common/util/TestShutdownHookManager.java b/common/src/test/org/apache/hive/common/util/TestShutdownHookManager.java index 66f6073..d740670 100644 --- a/common/src/test/org/apache/hive/common/util/TestShutdownHookManager.java +++ b/common/src/test/org/apache/hive/common/util/TestShutdownHookManager.java @@ -34,41 +34,6 @@ import org.apache.hadoop.hive.common.FileUtils; public class TestShutdownHookManager { @Test - public void shutdownHookManager() { - Assert.assertEquals(1, ShutdownHookManager.getShutdownHooksInOrder().size()); - Runnable hook1 = new Runnable() { - @Override - public void run() { - } - }; - Runnable hook2 = new Runnable() { - @Override - public void run() { - } - }; - - ShutdownHookManager.addShutdownHook(hook1, 0); - Assert.assertTrue(ShutdownHookManager.hasShutdownHook(hook1)); - Assert.assertEquals(2, ShutdownHookManager.getShutdownHooksInOrder().size()); - Assert.assertEquals(hook1, ShutdownHookManager.getShutdownHooksInOrder().get(0)); - ShutdownHookManager.removeShutdownHook(hook1); - Assert.assertFalse(ShutdownHookManager.hasShutdownHook(hook1)); - - ShutdownHookManager.addShutdownHook(hook1, 0); - Assert.assertTrue(ShutdownHookManager.hasShutdownHook(hook1)); - Assert.assertEquals(2, ShutdownHookManager.getShutdownHooksInOrder().size()); - Assert.assertTrue(ShutdownHookManager.hasShutdownHook(hook1)); - Assert.assertEquals(2, ShutdownHookManager.getShutdownHooksInOrder().size()); - - ShutdownHookManager.addShutdownHook(hook2, 1); - Assert.assertTrue(ShutdownHookManager.hasShutdownHook(hook1)); - Assert.assertTrue(ShutdownHookManager.hasShutdownHook(hook2)); - Assert.assertEquals(3, ShutdownHookManager.getShutdownHooksInOrder().size()); - Assert.assertEquals(hook2, ShutdownHookManager.getShutdownHooksInOrder().get(0)); - Assert.assertEquals(hook1, ShutdownHookManager.getShutdownHooksInOrder().get(1)); - } - - @Test public void deleteOnExit() throws IOException { File file = FileUtils.createTempFile(null, "tmp", null); Assert.assertTrue(ShutdownHookManager.isRegisteredToDeleteOnExit(file)); http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/hcatalog/core/src/main/java/org/apache/hive/hcatalog/common/HiveClientCache.java ---------------------------------------------------------------------- diff --git a/hcatalog/core/src/main/java/org/apache/hive/hcatalog/common/HiveClientCache.java b/hcatalog/core/src/main/java/org/apache/hive/hcatalog/common/HiveClientCache.java index 51f516e..c1b63d9 100644 --- a/hcatalog/core/src/main/java/org/apache/hive/hcatalog/common/HiveClientCache.java +++ b/hcatalog/core/src/main/java/org/apache/hive/hcatalog/common/HiveClientCache.java @@ -42,6 +42,7 @@ import org.apache.hadoop.hive.metastore.annotation.NoReconnect; import org.apache.hadoop.hive.shims.ShimLoader; import org.apache.hadoop.hive.shims.Utils; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hive.common.util.ShutdownHookManager; import org.apache.thrift.TException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -217,7 +218,7 @@ class HiveClientCache { } }; - Runtime.getRuntime().addShutdownHook(cleanupHiveClientShutdownThread); + ShutdownHookManager.addShutdownHook(cleanupHiveClientShutdownThread); } /** http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 3f85ca6..f0b8476 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -97,6 +97,7 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.StringUtils; import org.apache.hive.common.util.HiveStringUtils; +import org.apache.hive.common.util.ShutdownHookManager; import org.apache.thrift.TException; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; @@ -6641,7 +6642,7 @@ public class HiveMetaStore extends ThriftHiveMetastore { } // Add shutdown hook. - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { String shutdownMsg = "Shutting down hive metastore."; http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java index bb6ed84..41887d7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java @@ -54,6 +54,7 @@ import org.apache.hadoop.mapred.JobStatus; import org.apache.hadoop.mapred.RunningJob; import org.apache.hadoop.mapred.TaskCompletionEvent; import org.apache.hadoop.mapred.TaskReport; +import org.apache.hive.common.util.ShutdownHookManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Logger; @@ -172,7 +173,7 @@ public class HadoopJobExecHelper { * */ static { - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { killRunningJobs(); http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/ql/src/java/org/apache/hadoop/hive/ql/exec/spark/session/SparkSessionManagerImpl.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/spark/session/SparkSessionManagerImpl.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/spark/session/SparkSessionManagerImpl.java index 75e5913..3c2f0e6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/spark/session/SparkSessionManagerImpl.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/spark/session/SparkSessionManagerImpl.java @@ -24,6 +24,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.apache.hive.common.util.ShutdownHookManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.hive.conf.HiveConf; @@ -46,7 +47,7 @@ public class SparkSessionManagerImpl implements SparkSessionManager { private static SparkSessionManagerImpl instance; static { - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { try { http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TezJobMonitor.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TezJobMonitor.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TezJobMonitor.java index d617879..211a281 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TezJobMonitor.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TezJobMonitor.java @@ -48,6 +48,7 @@ import org.apache.hadoop.hive.ql.log.PerfLogger; import org.apache.hadoop.hive.ql.plan.BaseWork; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.ql.session.SessionState.LogHelper; +import org.apache.hive.common.util.ShutdownHookManager; import org.apache.tez.common.counters.FileSystemCounter; import org.apache.tez.common.counters.TaskCounter; import org.apache.tez.common.counters.TezCounter; @@ -140,7 +141,7 @@ public class TezJobMonitor { static { shutdownList = new LinkedList<DAGClient>(); - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { TezJobMonitor.killRunningJobs(); http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/ql/src/java/org/apache/hadoop/hive/ql/hooks/ATSHook.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/hooks/ATSHook.java b/ql/src/java/org/apache/hadoop/hive/ql/hooks/ATSHook.java index e593945..7438570 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/hooks/ATSHook.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/hooks/ATSHook.java @@ -37,6 +37,7 @@ import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity; import org.apache.hadoop.yarn.api.records.timeline.TimelineEvent; import org.apache.hadoop.yarn.client.api.TimelineClient; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hive.common.util.ShutdownHookManager; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,7 +76,7 @@ public class ATSHook implements ExecuteWithHookContext { timelineClient.init(yarnConf); timelineClient.start(); - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { try { http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/CuratorFrameworkSingleton.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/CuratorFrameworkSingleton.java b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/CuratorFrameworkSingleton.java index 6482f3b..b55b6ca 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/CuratorFrameworkSingleton.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/CuratorFrameworkSingleton.java @@ -20,6 +20,7 @@ package org.apache.hadoop.hive.ql.lockmgr.zookeeper; import java.util.concurrent.TimeUnit; +import org.apache.hive.common.util.ShutdownHookManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.curator.framework.CuratorFramework; @@ -34,7 +35,7 @@ public class CuratorFrameworkSingleton { static final Logger LOG = LoggerFactory.getLogger("CuratorFrameworkSingleton"); static { // Add shutdown hook. - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { closeAndReleaseInstance(); http://git-wip-us.apache.org/repos/asf/hive/blob/ff67cdda/service/src/java/org/apache/hive/service/server/HiveServer2.java ---------------------------------------------------------------------- diff --git a/service/src/java/org/apache/hive/service/server/HiveServer2.java b/service/src/java/org/apache/hive/service/server/HiveServer2.java index 9822a85..58e9aeb 100644 --- a/service/src/java/org/apache/hive/service/server/HiveServer2.java +++ b/service/src/java/org/apache/hive/service/server/HiveServer2.java @@ -60,6 +60,7 @@ import org.apache.hadoop.hive.shims.Utils; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hive.common.util.HiveStringUtils; import org.apache.hive.common.util.HiveVersionInfo; +import org.apache.hive.common.util.ShutdownHookManager; import org.apache.hive.http.HttpServer; import org.apache.hive.http.LlapServlet; import org.apache.hive.service.CompositeService; @@ -206,7 +207,7 @@ public class HiveServer2 extends CompositeService { throw new ServiceException(ie); } // Add a shutdown hook for catching SIGTERM & SIGINT - Runtime.getRuntime().addShutdownHook(new Thread() { + ShutdownHookManager.addShutdownHook(new Runnable() { @Override public void run() { hiveServer2.stop();