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 82b217b93eab..0c80ab3e58c6 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 @@ -70,9 +70,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; @@ -138,7 +137,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)); } @@ -1063,8 +1062,7 @@ protected void periodicExecute(Env env) { } public int getWorkerThreadCount() { - final CopyOnWriteArrayList workers = workerThreads; - return workers == null ? 0 : workers.size(); + return workerThreads.size(); } @TestOnly @@ -1074,10 +1072,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() {