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() {

Reply via email to