This is an automated email from the ASF dual-hosted git repository. dlmarion pushed a commit to branch 2.1 in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/2.1 by this push: new 40c99ccc48 Disable metrics for thread pools when metrics disabled (#5605) 40c99ccc48 is described below commit 40c99ccc48b1fb176e162d8861f3856472773022 Author: Dave Marion <dlmar...@apache.org> AuthorDate: Mon Jun 2 13:26:02 2025 -0400 Disable metrics for thread pools when metrics disabled (#5605) Metrics were being registered and emitted for thread pools regardless of the metrics property setting. Added a mechanism to disable metrics collection for thread pools when the property is false. Co-authored-by: Keith Turner <ktur...@apache.org> --- .../DefaultContextClassLoaderFactory.java | 2 +- .../accumulo/core/clientImpl/ClientContext.java | 14 ++++++------ .../accumulo/core/util/threads/ThreadPools.java | 25 ++++++++++++++++++++-- .../accumulo/server/metrics/MetricsInfoImpl.java | 1 + 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/classloader/DefaultContextClassLoaderFactory.java b/core/src/main/java/org/apache/accumulo/core/classloader/DefaultContextClassLoaderFactory.java index cc829a908e..1bd5fcb670 100644 --- a/core/src/main/java/org/apache/accumulo/core/classloader/DefaultContextClassLoaderFactory.java +++ b/core/src/main/java/org/apache/accumulo/core/classloader/DefaultContextClassLoaderFactory.java @@ -74,7 +74,7 @@ public class DefaultContextClassLoaderFactory implements ContextClassLoaderFacto private static void startCleanupThread(final AccumuloConfiguration conf, final Supplier<Map<String,String>> contextConfigSupplier) { ScheduledFuture<?> future = - ((ScheduledThreadPoolExecutor) ThreadPools.getClientThreadPools((t, e) -> { + ((ScheduledThreadPoolExecutor) ThreadPools.getClientThreadPools(conf, (t, e) -> { LOG.error("context classloader cleanup thread has failed.", e); }).createExecutorService(conf, Property.GENERAL_THREADPOOL_SIZE, false)) .scheduleWithFixedDelay(Threads.createNamedRunnable(className + "-cleanup", () -> { diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java index c9e714f74c..2b154c0519 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java @@ -153,7 +153,7 @@ public class ClientContext implements AccumuloClient { @SuppressWarnings("deprecation") private org.apache.accumulo.core.client.admin.ReplicationOperations replicationops = null; private final SingletonReservation singletonReservation; - private final ThreadPools clientThreadPools; + private final Supplier<ThreadPools> clientThreadPools; private ThreadPoolExecutor cleanupThreadPool; private ThreadPoolExecutor scannerReadaheadPool; @@ -238,15 +238,15 @@ public class ClientContext implements AccumuloClient { this.tableops = new TableOperationsImpl(this); this.namespaceops = new NamespaceOperationsImpl(this, tableops); if (ueh == Threads.UEH) { - clientThreadPools = ThreadPools.getServerThreadPools(); + clientThreadPools = () -> ThreadPools.getServerThreadPools(); } else { // Provide a default UEH that just logs the error if (ueh == null) { - clientThreadPools = ThreadPools.getClientThreadPools((t, e) -> { + clientThreadPools = () -> ThreadPools.getClientThreadPools(getConfiguration(), (t, e) -> { log.error("Caught an Exception in client background thread: {}. Thread is dead.", t, e); }); } else { - clientThreadPools = ThreadPools.getClientThreadPools(ueh); + clientThreadPools = () -> ThreadPools.getClientThreadPools(getConfiguration(), ueh); } } } @@ -260,7 +260,7 @@ public class ClientContext implements AccumuloClient { submitScannerReadAheadTask(Callable<List<KeyValue>> c) { ensureOpen(); if (scannerReadaheadPool == null) { - scannerReadaheadPool = clientThreadPools.getPoolBuilder(SCANNER_READ_AHEAD_POOL) + scannerReadaheadPool = clientThreadPools.get().getPoolBuilder(SCANNER_READ_AHEAD_POOL) .numCoreThreads(0).numMaxThreads(Integer.MAX_VALUE).withTimeOut(3L, SECONDS) .withQueue(new SynchronousQueue<>()).build(); } @@ -270,7 +270,7 @@ public class ClientContext implements AccumuloClient { public synchronized void executeCleanupTask(Runnable r) { ensureOpen(); if (cleanupThreadPool == null) { - cleanupThreadPool = clientThreadPools.getPoolBuilder(CONDITIONAL_WRITER_CLEANUP_POOL) + cleanupThreadPool = clientThreadPools.get().getPoolBuilder(CONDITIONAL_WRITER_CLEANUP_POOL) .numCoreThreads(1).withTimeOut(3L, SECONDS).build(); } this.cleanupThreadPool.execute(r); @@ -281,7 +281,7 @@ public class ClientContext implements AccumuloClient { */ public ThreadPools threadPools() { ensureOpen(); - return clientThreadPools; + return clientThreadPools.get(); } /** diff --git a/core/src/main/java/org/apache/accumulo/core/util/threads/ThreadPools.java b/core/src/main/java/org/apache/accumulo/core/util/threads/ThreadPools.java index b30505c1fc..e0c8873198 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/threads/ThreadPools.java +++ b/core/src/main/java/org/apache/accumulo/core/util/threads/ThreadPools.java @@ -58,6 +58,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.IntSupplier; @@ -99,9 +100,14 @@ public class ThreadPools { return SERVER_INSTANCE; } - public static final ThreadPools getClientThreadPools(UncaughtExceptionHandler ueh) { + public static final ThreadPools getClientThreadPools(AccumuloConfiguration conf, + UncaughtExceptionHandler ueh) { ThreadPools clientPools = new ThreadPools(ueh); - clientPools.setMeterRegistry(Metrics.globalRegistry); + if (conf.getBoolean(Property.GENERAL_MICROMETER_ENABLED) == false) { + clientPools.disableThreadPoolMetrics(); + } else { + clientPools.setMeterRegistry(Metrics.globalRegistry); + } return clientPools; } @@ -718,10 +724,14 @@ public class ThreadPools { return result; } + private final AtomicBoolean metricsEnabled = new AtomicBoolean(true); private final AtomicReference<MeterRegistry> registry = new AtomicReference<>(); private final List<ExecutorServiceMetrics> earlyExecutorServices = new ArrayList<>(); private void addExecutorServiceMetrics(ExecutorService executor, String name) { + if (!metricsEnabled.get()) { + return; + } ExecutorServiceMetrics esm = new ExecutorServiceMetrics(executor, name, List.of()); synchronized (earlyExecutorServices) { MeterRegistry r = registry.get(); @@ -743,4 +753,15 @@ public class ThreadPools { } } + /** + * Called by MetricsInfoImpl.init on the server side if metrics are disabled. ClientContext calls + * {@code #getClientThreadPools(AccumuloConfiguration, UncaughtExceptionHandler)} above. + */ + public void disableThreadPoolMetrics() { + metricsEnabled.set(false); + synchronized (earlyExecutorServices) { + earlyExecutorServices.clear(); + } + } + } diff --git a/server/base/src/main/java/org/apache/accumulo/server/metrics/MetricsInfoImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metrics/MetricsInfoImpl.java index 1249d901c0..b8434828a6 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metrics/MetricsInfoImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metrics/MetricsInfoImpl.java @@ -119,6 +119,7 @@ public class MetricsInfoImpl implements MetricsInfo { Objects.requireNonNull(tags); if (!metricsEnabled) { + ThreadPools.getServerThreadPools().disableThreadPoolMetrics(); LOG.info("Metrics not initialized, metrics are disabled."); return; }