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

tanxinyu pushed a commit to branch fix_threadpool_metric_npe_cp
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 56d6a25e0f836742f5d7ad7b28506ccd7e5e9f56
Author: OneSizeFitQuorum <[email protected]>
AuthorDate: Thu Dec 12 11:14:05 2024 +0800

    fix concurrent bug
    
    Signed-off-by: OneSizeFitQuorum <[email protected]>
---
 .../commons/concurrent/ThreadPoolMetrics.java      | 172 ++++++++++-----------
 1 file changed, 85 insertions(+), 87 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 67bc150664f..d0cf06c1108 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
@@ -32,9 +32,10 @@ import java.util.Map;
 
 @SuppressWarnings("java:S6548")
 public class ThreadPoolMetrics implements IMetricSet {
+
   private AbstractMetricService metricService;
-  private Map<String, IThreadPoolMBean> notRegisteredPoolMap = new HashMap<>();
-  private Map<String, IThreadPoolMBean> registeredPoolMap = new HashMap<>();
+  private final Map<String, IThreadPoolMBean> notRegisteredPoolMap = new 
HashMap<>();
+  private final Map<String, IThreadPoolMBean> registeredPoolMap = new 
HashMap<>();
 
   public static ThreadPoolMetrics getInstance() {
     return ThreadPoolMetricsHolder.INSTANCE;
@@ -42,99 +43,95 @@ public class ThreadPoolMetrics implements IMetricSet {
 
   private ThreadPoolMetrics() {}
 
-  public void registerThreadPool(IThreadPoolMBean pool, String name) {
-    synchronized (this) {
-      if (metricService == null) {
-        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);
-      }
+  public synchronized void registerThreadPool(IThreadPoolMBean pool, String 
name) {
+    if (metricService == null) {
+      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);
     }
   }
 
   @Override
-  public void bindTo(AbstractMetricService metricService) {
-    synchronized (this) {
-      this.metricService = metricService;
-      for (Map.Entry<String, IThreadPoolMBean> entry : 
notRegisteredPoolMap.entrySet()) {
-        metricService.createAutoGauge(
-            SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
-            MetricLevel.IMPORTANT,
-            registeredPoolMap,
-            map -> entry.getValue().getActiveCount(),
-            SystemTag.POOL_NAME.toString(),
-            entry.getKey());
-        metricService.createAutoGauge(
-            SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
-            MetricLevel.IMPORTANT,
-            registeredPoolMap,
-            map -> entry.getValue().getCorePoolSize(),
-            SystemTag.POOL_NAME.toString(),
-            entry.getKey());
-        metricService.createAutoGauge(
-            SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
-            MetricLevel.IMPORTANT,
-            registeredPoolMap,
-            map -> entry.getValue().getQueue().size(),
-            SystemTag.POOL_NAME.toString(),
-            entry.getKey());
-        metricService.createAutoGauge(
-            SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
-            MetricLevel.IMPORTANT,
-            registeredPoolMap,
-            map -> entry.getValue().getCompletedTaskCount(),
-            SystemTag.POOL_NAME.toString(),
-            entry.getKey());
-        metricService.createAutoGauge(
-            SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
-            MetricLevel.IMPORTANT,
-            registeredPoolMap,
-            map -> entry.getValue().getLargestPoolSize(),
-            SystemTag.POOL_NAME.toString(),
-            entry.getKey());
-      }
-      registeredPoolMap.putAll(notRegisteredPoolMap);
-      notRegisteredPoolMap.clear();
+  public synchronized void bindTo(AbstractMetricService metricService) {
+    this.metricService = metricService;
+    for (Map.Entry<String, IThreadPoolMBean> entry : 
notRegisteredPoolMap.entrySet()) {
+      metricService.createAutoGauge(
+          SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
+          MetricLevel.IMPORTANT,
+          registeredPoolMap,
+          map -> entry.getValue().getActiveCount(),
+          SystemTag.POOL_NAME.toString(),
+          entry.getKey());
+      metricService.createAutoGauge(
+          SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
+          MetricLevel.IMPORTANT,
+          registeredPoolMap,
+          map -> entry.getValue().getCorePoolSize(),
+          SystemTag.POOL_NAME.toString(),
+          entry.getKey());
+      metricService.createAutoGauge(
+          SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
+          MetricLevel.IMPORTANT,
+          registeredPoolMap,
+          map -> entry.getValue().getQueue().size(),
+          SystemTag.POOL_NAME.toString(),
+          entry.getKey());
+      metricService.createAutoGauge(
+          SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
+          MetricLevel.IMPORTANT,
+          registeredPoolMap,
+          map -> entry.getValue().getCompletedTaskCount(),
+          SystemTag.POOL_NAME.toString(),
+          entry.getKey());
+      metricService.createAutoGauge(
+          SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
+          MetricLevel.IMPORTANT,
+          registeredPoolMap,
+          map -> entry.getValue().getLargestPoolSize(),
+          SystemTag.POOL_NAME.toString(),
+          entry.getKey());
     }
+    registeredPoolMap.putAll(notRegisteredPoolMap);
+    notRegisteredPoolMap.clear();
   }
 
   @Override
-  public void unbindFrom(AbstractMetricService metricService) {
+  public synchronized void unbindFrom(AbstractMetricService metricService) {
     for (Map.Entry<String, IThreadPoolMBean> entry : 
registeredPoolMap.entrySet()) {
       metricService.remove(
           MetricType.GAUGE,
@@ -165,6 +162,7 @@ public class ThreadPoolMetrics implements IMetricSet {
   }
 
   private static class ThreadPoolMetricsHolder {
+
     private static final ThreadPoolMetrics INSTANCE = new ThreadPoolMetrics();
 
     private ThreadPoolMetricsHolder() {}

Reply via email to