diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java index 0b5460486b29c..f98c4b93cbe0e 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java @@ -72,9 +72,8 @@ public class ProcedureExecutor { private final ThreadGroup threadGroup = new ThreadGroup(ThreadName.CONFIG_NODE_PROCEDURE_WORKER.getName()); - // Metrics may be scraped before init() and concurrently with initialization during a ConfigNode - // leader transition. - private volatile CopyOnWriteArrayList workerThreads; + // leader transition, so keep an always-present thread-safe list. + private final CopyOnWriteArrayList workerThreads = new CopyOnWriteArrayList<>(); private volatile CopyOnWriteArrayList dropTableWorkerThreads; private TimeoutExecutorThread timeoutExecutor; @@ -140,7 +139,7 @@ public synchronized void init(int numThreads) { new TimeoutExecutorThread<>( this, threadGroup, ThreadName.CONFIG_NODE_WORKER_THREAD_MONITOR.getName()); workId.set(0); - workerThreads = new CopyOnWriteArrayList<>(); + workerThreads.clear(); for (int i = 0; i < corePoolSize; i++) { workerThreads.add(new WorkerThread(threadGroup, scheduler)); } @@ -1181,8 +1180,7 @@ protected void periodicExecute(Env env) { } public int getWorkerThreadCount() { - final CopyOnWriteArrayList workers = workerThreads; - return workers == null ? 0 : workers.size(); + return workerThreads.size(); } @TestOnly @@ -1192,10 +1190,7 @@ public int getDropTableWorkerThreadCount() { } public long getActiveWorkerThreadCount() { - final CopyOnWriteArrayList workers = workerThreads; - return workers == null - ? 0 - : workers.stream().filter(worker -> worker.activeProcedure.get() != null).count(); + return workerThreads.stream().filter(worker -> worker.activeProcedure.get() != null).count(); } public boolean isRunning() {