Skip to content

Commit abc546a

Browse files
[To dev/1.3] Fix ThreadPoolMetric NPE (#14405)
Signed-off-by: OneSizeFitQuorum <[email protected]>
1 parent d0c32f0 commit abc546a

File tree

1 file changed

+77
-62
lines changed

1 file changed

+77
-62
lines changed

iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java

Lines changed: 77 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -48,87 +48,102 @@ public synchronized void registerThreadPool(IThreadPoolMBean pool, String name)
4848
notRegisteredPoolMap.put(name, pool);
4949
} else {
5050
registeredPoolMap.put(name, pool);
51-
metricService.createAutoGauge(
52-
SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
53-
MetricLevel.IMPORTANT,
54-
registeredPoolMap,
55-
map -> registeredPoolMap.get(name).getActiveCount(),
56-
SystemTag.POOL_NAME.toString(),
57-
name);
58-
metricService.createAutoGauge(
59-
SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
60-
MetricLevel.IMPORTANT,
61-
registeredPoolMap,
62-
map -> registeredPoolMap.get(name).getCorePoolSize(),
63-
SystemTag.POOL_NAME.toString(),
64-
name);
65-
metricService.createAutoGauge(
66-
SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
67-
MetricLevel.IMPORTANT,
68-
registeredPoolMap,
69-
map -> registeredPoolMap.get(name).getQueueLength(),
70-
SystemTag.POOL_NAME.toString(),
71-
name);
72-
metricService.createAutoGauge(
73-
SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
74-
MetricLevel.IMPORTANT,
75-
registeredPoolMap,
76-
map -> registeredPoolMap.get(name).getCompletedTaskCount(),
77-
SystemTag.POOL_NAME.toString(),
78-
name);
79-
metricService.createAutoGauge(
80-
SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
81-
MetricLevel.IMPORTANT,
82-
registeredPoolMap,
83-
map -> registeredPoolMap.get(name).getLargestPoolSize(),
84-
SystemTag.POOL_NAME.toString(),
85-
name);
51+
registerThreadPoolMetrics(name);
8652
}
8753
}
8854

55+
private void registerThreadPoolMetrics(String name) {
56+
metricService.createAutoGauge(
57+
SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
58+
MetricLevel.IMPORTANT,
59+
registeredPoolMap,
60+
map -> registeredPoolMap.get(name).getActiveCount(),
61+
SystemTag.POOL_NAME.toString(),
62+
name);
63+
metricService.createAutoGauge(
64+
SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
65+
MetricLevel.IMPORTANT,
66+
registeredPoolMap,
67+
map -> registeredPoolMap.get(name).getCorePoolSize(),
68+
SystemTag.POOL_NAME.toString(),
69+
name);
70+
metricService.createAutoGauge(
71+
SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
72+
MetricLevel.IMPORTANT,
73+
registeredPoolMap,
74+
map -> registeredPoolMap.get(name).getQueueLength(),
75+
SystemTag.POOL_NAME.toString(),
76+
name);
77+
metricService.createAutoGauge(
78+
SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
79+
MetricLevel.IMPORTANT,
80+
registeredPoolMap,
81+
map -> registeredPoolMap.get(name).getCompletedTaskCount(),
82+
SystemTag.POOL_NAME.toString(),
83+
name);
84+
metricService.createAutoGauge(
85+
SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
86+
MetricLevel.IMPORTANT,
87+
registeredPoolMap,
88+
map -> registeredPoolMap.get(name).getLargestPoolSize(),
89+
SystemTag.POOL_NAME.toString(),
90+
name);
91+
}
92+
8993
public synchronized void unRegisterThreadPool(String name) {
9094
if (metricService == null) {
9195
notRegisteredPoolMap.remove(name);
9296
} else {
9397
registeredPoolMap.remove(name);
94-
metricService.remove(
95-
MetricType.GAUGE,
96-
SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
97-
SystemTag.POOL_NAME.toString(),
98-
name);
99-
metricService.remove(
100-
MetricType.GAUGE,
101-
SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
102-
SystemTag.POOL_NAME.toString(),
103-
name);
104-
metricService.remove(
105-
MetricType.GAUGE,
106-
SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
107-
SystemTag.POOL_NAME.toString(),
108-
name);
109-
metricService.remove(
110-
MetricType.GAUGE,
111-
SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
112-
SystemTag.POOL_NAME.toString(),
113-
name);
114-
metricService.remove(
115-
MetricType.GAUGE,
116-
SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
117-
SystemTag.POOL_NAME.toString(),
118-
name);
98+
unRegisterThreadPoolMetrics(name);
11999
}
120100
}
121101

102+
private void unRegisterThreadPoolMetrics(String name) {
103+
metricService.remove(
104+
MetricType.GAUGE,
105+
SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(),
106+
SystemTag.POOL_NAME.toString(),
107+
name);
108+
metricService.remove(
109+
MetricType.GAUGE,
110+
SystemMetric.THREAD_POOL_CORE_SIZE.toString(),
111+
SystemTag.POOL_NAME.toString(),
112+
name);
113+
metricService.remove(
114+
MetricType.GAUGE,
115+
SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(),
116+
SystemTag.POOL_NAME.toString(),
117+
name);
118+
metricService.remove(
119+
MetricType.GAUGE,
120+
SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(),
121+
SystemTag.POOL_NAME.toString(),
122+
name);
123+
metricService.remove(
124+
MetricType.GAUGE,
125+
SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(),
126+
SystemTag.POOL_NAME.toString(),
127+
name);
128+
}
129+
122130
@Override
123131
public synchronized void bindTo(AbstractMetricService metricService) {
124132
this.metricService = metricService;
125-
notRegisteredPoolMap.forEach((name, pool) -> registerThreadPool(pool, name));
133+
for (Map.Entry<String, IThreadPoolMBean> entry : notRegisteredPoolMap.entrySet()) {
134+
registerThreadPoolMetrics(entry.getKey());
135+
}
136+
registeredPoolMap.putAll(notRegisteredPoolMap);
126137
notRegisteredPoolMap.clear();
127138
}
128139

129140
@Override
130141
public synchronized void unbindFrom(AbstractMetricService metricService) {
131-
registeredPoolMap.forEach((name, pool) -> unRegisterThreadPool(name));
142+
for (Map.Entry<String, IThreadPoolMBean> entry : registeredPoolMap.entrySet()) {
143+
unRegisterThreadPoolMetrics(entry.getKey());
144+
}
145+
registeredPoolMap.clear();
146+
notRegisteredPoolMap.clear();
132147
}
133148

134149
private static class ThreadPoolMetricsHolder {

0 commit comments

Comments
 (0)