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() {}
