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