This is an automated email from the ASF dual-hosted git repository.

stigahuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git

commit 41117e649049b3490639851c611d9d6a044c64c2
Author: Joe McDonnell <[email protected]>
AuthorDate: Mon Jan 30 09:43:34 2023 -0800

    IMPALA-11865: Set thread names for Java thread pools
    
    Currently, some Java thread pools use the default
    thread names, which take the form "pool-N-thread-M".
    This sets the thread names to more human-friendly names
    by adding a ThreadFactory to Executor thread pools
    in our Java code. This should make the jstack output
    easier to understand. For example, "pool-8-thread-1"
    becomes "TableLoadingSubmitterThread-0".
    
    Testing:
     - Ran jstack locally and verified
    
    Change-Id: I583093eeb2e92a208ee5ea5a023686e36436c4dc
    Reviewed-on: http://gerrit.cloudera.org:8080/19458
    Reviewed-by: Michael Smith <[email protected]>
    Tested-by: Impala Public Jenkins <[email protected]>
---
 .../org/apache/impala/catalog/CatalogServiceCatalog.java    |  5 ++++-
 .../java/org/apache/impala/catalog/TableLoadingMgr.java     | 13 ++++++++++---
 .../impala/catalog/metastore/CatalogMetastoreServer.java    |  5 ++++-
 .../java/org/apache/impala/hooks/QueryEventHookManager.java |  6 +++++-
 fe/src/main/java/org/apache/impala/service/Frontend.java    |  7 ++++---
 5 files changed, 27 insertions(+), 9 deletions(-)

diff --git 
a/fe/src/main/java/org/apache/impala/catalog/CatalogServiceCatalog.java 
b/fe/src/main/java/org/apache/impala/catalog/CatalogServiceCatalog.java
index 0a8e70c4c..6297b8d86 100644
--- a/fe/src/main/java/org/apache/impala/catalog/CatalogServiceCatalog.java
+++ b/fe/src/main/java/org/apache/impala/catalog/CatalogServiceCatalog.java
@@ -138,6 +138,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
 /**
  * Specialized Catalog that implements the CatalogService specific Catalog
@@ -265,7 +266,9 @@ public class CatalogServiceCatalog extends Catalog {
 
   // Periodically polls HDFS to get the latest set of known cache pools.
   private final ScheduledExecutorService cachePoolReader_ =
-      Executors.newScheduledThreadPool(1);
+    Executors.newScheduledThreadPool(1,
+        new ThreadFactoryBuilder().setDaemon(true)
+            .setNameFormat("HDFSCachePoolReader").build());
 
   // Log of deleted catalog objects.
   private final CatalogDeltaLog deleteLog_;
diff --git a/fe/src/main/java/org/apache/impala/catalog/TableLoadingMgr.java 
b/fe/src/main/java/org/apache/impala/catalog/TableLoadingMgr.java
index 37685c6ff..53df82dc4 100644
--- a/fe/src/main/java/org/apache/impala/catalog/TableLoadingMgr.java
+++ b/fe/src/main/java/org/apache/impala/catalog/TableLoadingMgr.java
@@ -36,6 +36,7 @@ import org.apache.impala.util.HdfsCachingUtil;
 import org.apache.log4j.Logger;
 
 import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
 /**
 * Class that manages scheduling the loading of table metadata from the Hive 
Metastore and
@@ -148,7 +149,9 @@ public class TableLoadingMgr {
   // (no work will be rejected, but memory consumption is unbounded). If this 
thread
   // dies it will be automatically restarted.
   // The tables to process are read from the resfreshThreadWork_ queue.
-  ExecutorService asyncRefreshThread_ = Executors.newSingleThreadExecutor();
+  ExecutorService asyncRefreshThread_ = Executors.newSingleThreadExecutor(
+      new ThreadFactoryBuilder().setDaemon(true)
+          .setNameFormat("TableAsyncRefreshThread").build());
 
   // Tables for the async refresh thread to process. Synchronization must be 
handled
   // externally.
@@ -162,7 +165,9 @@ public class TableLoadingMgr {
     catalog_ = catalog;
     tblLoader_ = new TableLoader(catalog_);
     numLoadingThreads_ = numLoadingThreads;
-    tblLoadingPool_ = Executors.newFixedThreadPool(numLoadingThreads_);
+    tblLoadingPool_ = Executors.newFixedThreadPool(numLoadingThreads_,
+        new ThreadFactoryBuilder().setDaemon(true)
+            .setNameFormat("TableLoadingThread-%d").build());
 
     // Start the background table loading submitter threads.
     startTableLoadingSubmitterThreads();
@@ -265,7 +270,9 @@ public class TableLoadingMgr {
    */
   private void startTableLoadingSubmitterThreads() {
     ExecutorService submitterLoadingPool =
-        Executors.newFixedThreadPool(numLoadingThreads_);
+      Executors.newFixedThreadPool(numLoadingThreads_,
+          new ThreadFactoryBuilder().setDaemon(true)
+              .setNameFormat("TableLoadingSubmitterThread-%d").build());
     try {
       for (int i = 0; i < numLoadingThreads_; ++i) {
         submitterLoadingPool.execute(new Runnable() {
diff --git 
a/fe/src/main/java/org/apache/impala/catalog/metastore/CatalogMetastoreServer.java
 
b/fe/src/main/java/org/apache/impala/catalog/metastore/CatalogMetastoreServer.java
index 14a0f6076..4affa9c84 100644
--- 
a/fe/src/main/java/org/apache/impala/catalog/metastore/CatalogMetastoreServer.java
+++ 
b/fe/src/main/java/org/apache/impala/catalog/metastore/CatalogMetastoreServer.java
@@ -28,6 +28,7 @@ import java.util.Set;
 import com.codahale.metrics.Timer;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
@@ -109,7 +110,9 @@ public class CatalogMetastoreServer extends 
ThriftHiveMetastore implements
 
   // Logs Catalogd HMS cache metrics at a fixed frequency.
   private final ScheduledExecutorService metricsLoggerService_ =
-      Executors.newScheduledThreadPool(1);
+    Executors.newScheduledThreadPool(1,
+        new ThreadFactoryBuilder().setDaemon(true)
+            .setNameFormat("MetricsLoggerService").build());
 
   // the server is started in a daemon thread so that instantiating this is not
   // a blocking call.
diff --git 
a/fe/src/main/java/org/apache/impala/hooks/QueryEventHookManager.java 
b/fe/src/main/java/org/apache/impala/hooks/QueryEventHookManager.java
index eef24673b..1f78597dd 100644
--- a/fe/src/main/java/org/apache/impala/hooks/QueryEventHookManager.java
+++ b/fe/src/main/java/org/apache/impala/hooks/QueryEventHookManager.java
@@ -31,6 +31,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
 /**
  * {@link QueryEventHookManager} manages the registration and execution of
  * {@link QueryEventHook}s. Each manager instance may manage its own hooks,
@@ -117,7 +119,9 @@ public class QueryEventHookManager {
   private QueryEventHookManager(int nHookExecutorThreads, String[] hookClasses)
       throws InternalException {
 
-    this.hookExecutor_ = Executors.newFixedThreadPool(nHookExecutorThreads);
+    this.hookExecutor_ = Executors.newFixedThreadPool(nHookExecutorThreads,
+        new ThreadFactoryBuilder().setDaemon(true)
+            .setNameFormat("QueryEventHookExecutor-%d").build());
     Runtime.getRuntime().addShutdownHook(new Thread(() -> this.cleanUp()));
 
     final List<QueryEventHook> hooks = new ArrayList<>(hookClasses.length);
diff --git a/fe/src/main/java/org/apache/impala/service/Frontend.java 
b/fe/src/main/java/org/apache/impala/service/Frontend.java
index a261f87ef..9c20f0084 100644
--- a/fe/src/main/java/org/apache/impala/service/Frontend.java
+++ b/fe/src/main/java/org/apache/impala/service/Frontend.java
@@ -27,6 +27,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.Uninterruptibles;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -394,8 +395,6 @@ public class Frontend {
    */
   private final AtomicReference<AuthorizationChecker> authzChecker_ =
       new AtomicReference<>();
-  private final ScheduledExecutorService policyReader_ =
-      Executors.newScheduledThreadPool(1);
 
   private final ImpaladTableUsageTracker impaladTableUsageTracker_;
 
@@ -444,7 +443,9 @@ public class Frontend {
         checkAuthorizationPool_ = MoreExecutors.newDirectExecutorService();
       } else {
         LOG.info("Using a thread pool of size {} for authorization", 
numThreads);
-        checkAuthorizationPool_ = Executors.newFixedThreadPool(numThreads);
+        checkAuthorizationPool_ = Executors.newFixedThreadPool(numThreads,
+            new ThreadFactoryBuilder().setDaemon(true)
+                .setNameFormat("AuthorizationCheckerThread-%d").build());
       }
     } else {
       authzChecker_.set(authzFactory.newAuthorizationChecker());

Reply via email to