This is an automated email from the ASF dual-hosted git repository. kgyrtkirk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hive.git
commit 3cadd2ac61b08b81390907f4b4380396e3a99ad5 Author: Eugene Chung <eugene.ch...@navercorp.com> AuthorDate: Thu Apr 23 14:35:47 2020 +0000 HIVE-23164: Server is not properly terminated because of non-daemon threads (Eugene Chung via Zoltan Haindrich) Signed-off-by: Zoltan Haindrich <zhaindr...@cloudera.com> --- .../hadoop/hive/ql/exec/tez/PerPoolTriggerValidatorRunnable.java | 6 +++++- .../main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java | 1 + .../main/java/org/apache/hadoop/hive/metastore/ThreadPool.java | 8 ++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/PerPoolTriggerValidatorRunnable.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/PerPoolTriggerValidatorRunnable.java index 8f29197..14a688e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/PerPoolTriggerValidatorRunnable.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/PerPoolTriggerValidatorRunnable.java @@ -20,8 +20,10 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hadoop.hive.ql.wm.SessionTriggerProvider; import org.apache.hadoop.hive.ql.wm.TriggerActionHandler; import org.slf4j.Logger; @@ -46,8 +48,10 @@ public class PerPoolTriggerValidatorRunnable implements Runnable { @Override public void run() { try { + ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(true) + .setNameFormat("PoolValidator %d").build(); ScheduledExecutorService validatorExecutorService = Executors - .newScheduledThreadPool(sessionTriggerProviders.size()); + .newScheduledThreadPool(sessionTriggerProviders.size(), threadFactory); for (Map.Entry<String, SessionTriggerProvider> entry : sessionTriggerProviders.entrySet()) { String poolName = entry.getKey(); if (!poolValidators.containsKey(poolName)) { diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 77d3404..32494ae 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -1115,6 +1115,7 @@ public class HiveMetaStore extends ThriftHiveMetastore { public void shutdown() { cleanupRawStore(); PerfLogger.getPerfLogger(false).cleanupPerfLogMetrics(); + ThreadPool.shutdown(); } @Override diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ThreadPool.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ThreadPool.java index d0fcd25..5dca2b3 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ThreadPool.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ThreadPool.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hive.metastore; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.conf.MetastoreConf; import org.slf4j.Logger; @@ -24,6 +25,7 @@ import org.slf4j.LoggerFactory; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; /** * Utility singleton class to manage all the threads. @@ -31,7 +33,7 @@ import java.util.concurrent.ScheduledExecutorService; public class ThreadPool { static final private Logger LOG = LoggerFactory.getLogger(ThreadPool.class); - private static ThreadPool self = null; + private static ThreadPool self; private static ScheduledExecutorService pool; public static synchronized ThreadPool initialize(Configuration conf) { @@ -43,8 +45,10 @@ public class ThreadPool { } private ThreadPool(Configuration conf) { + ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(true) + .setNameFormat("Metastore Scheduled Worker %d").build(); pool = Executors.newScheduledThreadPool(MetastoreConf.getIntVar(conf, - MetastoreConf.ConfVars.THREAD_POOL_SIZE)); + MetastoreConf.ConfVars.THREAD_POOL_SIZE), threadFactory); } public static ScheduledExecutorService getPool() {