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

haonan pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new abc546a8324 [To dev/1.3] Fix ThreadPoolMetric NPE (#14405)
abc546a8324 is described below

commit abc546a8324690b8b062893e13f517e1defc7dbe
Author: Potato <[email protected]>
AuthorDate: Thu Dec 12 21:06:37 2024 +0800

    [To dev/1.3] Fix ThreadPoolMetric NPE (#14405)
    
    Signed-off-by: OneSizeFitQuorum <[email protected]>
---
 .../commons/concurrent/ThreadPoolMetrics.java      | 139 ++++++++++++---------
 1 file changed, 77 insertions(+), 62 deletions(-)

diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java
index 05b6c63b0a5..a05742e38d3 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java
@@ -48,87 +48,102 @@ public class ThreadPoolMetrics implements IMetricSet {
       notRegisteredPoolMap.put(name, pool);
     } else {
       registeredPoolMap.put(name, pool);
-      metricService.createAutoGauge(
-          SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
-          MetricLevel.IMPORTANT,
-          registeredPoolMap,
-          map -> registeredPoolMap.get(name).getActiveCount(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.createAutoGauge(
-          SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
-          MetricLevel.IMPORTANT,
-          registeredPoolMap,
-          map -> registeredPoolMap.get(name).getCorePoolSize(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.createAutoGauge(
-          SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
-          MetricLevel.IMPORTANT,
-          registeredPoolMap,
-          map -> registeredPoolMap.get(name).getQueueLength(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.createAutoGauge(
-          SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
-          MetricLevel.IMPORTANT,
-          registeredPoolMap,
-          map -> registeredPoolMap.get(name).getCompletedTaskCount(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.createAutoGauge(
-          SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
-          MetricLevel.IMPORTANT,
-          registeredPoolMap,
-          map -> registeredPoolMap.get(name).getLargestPoolSize(),
-          SystemTag.POOL_NAME.toString(),
-          name);
+      registerThreadPoolMetrics(name);
     }
   }
 
+  private void registerThreadPoolMetrics(String name) {
+    metricService.createAutoGauge(
+        SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
+        MetricLevel.IMPORTANT,
+        registeredPoolMap,
+        map -> registeredPoolMap.get(name).getActiveCount(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.createAutoGauge(
+        SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
+        MetricLevel.IMPORTANT,
+        registeredPoolMap,
+        map -> registeredPoolMap.get(name).getCorePoolSize(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.createAutoGauge(
+        SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
+        MetricLevel.IMPORTANT,
+        registeredPoolMap,
+        map -> registeredPoolMap.get(name).getQueueLength(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.createAutoGauge(
+        SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
+        MetricLevel.IMPORTANT,
+        registeredPoolMap,
+        map -> registeredPoolMap.get(name).getCompletedTaskCount(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.createAutoGauge(
+        SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
+        MetricLevel.IMPORTANT,
+        registeredPoolMap,
+        map -> registeredPoolMap.get(name).getLargestPoolSize(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+  }
+
   public synchronized void unRegisterThreadPool(String name) {
     if (metricService == null) {
       notRegisteredPoolMap.remove(name);
     } else {
       registeredPoolMap.remove(name);
-      metricService.remove(
-          MetricType.GAUGE,
-          SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.remove(
-          MetricType.GAUGE,
-          SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.remove(
-          MetricType.GAUGE,
-          SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.remove(
-          MetricType.GAUGE,
-          SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
-          SystemTag.POOL_NAME.toString(),
-          name);
-      metricService.remove(
-          MetricType.GAUGE,
-          SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
-          SystemTag.POOL_NAME.toString(),
-          name);
+      unRegisterThreadPoolMetrics(name);
     }
   }
 
+  private void unRegisterThreadPoolMetrics(String name) {
+    metricService.remove(
+        MetricType.GAUGE,
+        SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.remove(
+        MetricType.GAUGE,
+        SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.remove(
+        MetricType.GAUGE,
+        SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.remove(
+        MetricType.GAUGE,
+        SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+    metricService.remove(
+        MetricType.GAUGE,
+        SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
+        SystemTag.POOL_NAME.toString(),
+        name);
+  }
+
   @Override
   public synchronized void bindTo(AbstractMetricService metricService) {
     this.metricService = metricService;
-    notRegisteredPoolMap.forEach((name, pool) -> registerThreadPool(pool, 
name));
+    for (Map.Entry<String, IThreadPoolMBean> entry : 
notRegisteredPoolMap.entrySet()) {
+      registerThreadPoolMetrics(entry.getKey());
+    }
+    registeredPoolMap.putAll(notRegisteredPoolMap);
     notRegisteredPoolMap.clear();
   }
 
   @Override
   public synchronized void unbindFrom(AbstractMetricService metricService) {
-    registeredPoolMap.forEach((name, pool) -> unRegisterThreadPool(name));
+    for (Map.Entry<String, IThreadPoolMBean> entry : 
registeredPoolMap.entrySet()) {
+      unRegisterThreadPoolMetrics(entry.getKey());
+    }
+    registeredPoolMap.clear();
+    notRegisteredPoolMap.clear();
   }
 
   private static class ThreadPoolMetricsHolder {

Reply via email to