Skip to content

Commit 26dbcc0

Browse files
committed
YARN-11211. QueueMetrics leaks Configuration objects when validation API is called multiple times
1 parent 6415eb0 commit 26dbcc0

File tree

4 files changed

+24
-5
lines changed

4 files changed

+24
-5
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/PartitionQueueMetrics.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public synchronized QueueMetrics getUserMetrics(String userName) {
7878
metrics = new PartitionQueueMetrics(this.metricsSystem, this.queueName,
7979
null, false, this.conf, this.partition);
8080
users.put(userName, metrics);
81-
metricsSystem.register(
81+
registerMetrics(
8282
pSourceName(partitionJMXStr).append(qSourceName(queueName))
8383
.append(",user=").append(userName).toString(),
8484
"Metrics for user '" + userName + "' in queue '" + queueName + "'",

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public synchronized QueueMetrics getUserMetrics(String userName) {
289289
metrics =
290290
new QueueMetrics(metricsSystem, queueName, null, false, conf);
291291
users.put(userName, metrics);
292-
metricsSystem.register(
292+
registerMetrics(
293293
sourceName(queueName).append(",user=").append(userName).toString(),
294294
"Metrics for user '"+ userName +"' in queue '"+ queueName +"'",
295295
metrics.tag(QUEUE_INFO, queueName).tag(USER_INFO, userName));
@@ -334,7 +334,7 @@ public synchronized QueueMetrics getPartitionQueueMetrics(String partition) {
334334
QueueMetrics queueMetrics =
335335
new PartitionQueueMetrics(metricsSystem, this.queueName, parentQueue,
336336
this.enableUserMetrics, this.conf, partition);
337-
metricsSystem.register(
337+
registerMetrics(
338338
pSourceName(partitionJMXStr).append(qSourceName(this.queueName))
339339
.toString(),
340340
"Metrics for queue: " + this.queueName,
@@ -378,7 +378,7 @@ private QueueMetrics getPartitionMetrics(String partition) {
378378

379379
// Register with the MetricsSystems
380380
if (metricsSystem != null) {
381-
metricsSystem.register(pSourceName(partitionJMXStr).toString(),
381+
registerMetrics(pSourceName(partitionJMXStr).toString(),
382382
"Metrics for partition: " + partitionJMXStr,
383383
(PartitionQueueMetrics) metrics.tag(PARTITION_INFO,
384384
partitionJMXStr));
@@ -1359,4 +1359,15 @@ public void setParentQueue(Queue parentQueue) {
13591359
}
13601360
}
13611361
}
1362+
1363+
protected void registerMetrics(String sourceName, String desc, QueueMetrics metrics) {
1364+
MetricsSource source = metricsSystem.getSource(sourceName);
1365+
// Unregister metrics if a source is already present
1366+
if (source != null) {
1367+
LOG.info("Unregistering source " + sourceName);
1368+
metricsSystem.unregisterSource(sourceName);
1369+
}
1370+
1371+
metricsSystem.register(sourceName, desc, metrics);
1372+
}
13621373
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map;
2222

2323
import org.apache.hadoop.conf.Configuration;
24+
import org.apache.hadoop.metrics2.MetricsSource;
2425
import org.apache.hadoop.metrics2.MetricsSystem;
2526
import org.apache.hadoop.metrics2.annotation.Metric;
2627
import org.apache.hadoop.metrics2.annotation.Metrics;
@@ -240,6 +241,10 @@ public synchronized static CSQueueMetrics forQueue(String queueName,
240241

241242
// Register with the MetricsSystems
242243
if (ms != null) {
244+
MetricsSource source = ms.getSource(sourceName(queueName).toString());
245+
if (source != null) {
246+
ms.unregisterSource(sourceName(queueName).toString());
247+
}
243248
metrics =
244249
ms.register(sourceName(queueName).toString(), "Metrics for queue: "
245250
+ queueName, metrics);
@@ -260,7 +265,7 @@ public synchronized QueueMetrics getUserMetrics(String userName) {
260265
metrics =
261266
new CSQueueMetrics(metricsSystem, queueName, null, false, conf);
262267
users.put(userName, metrics);
263-
metricsSystem.register(
268+
registerMetrics(
264269
sourceName(queueName).append(",user=").append(userName).toString(),
265270
"Metrics for user '" + userName + "' in queue '" + queueName + "'",
266271
((CSQueueMetrics) metrics.tag(QUEUE_INFO, queueName)).tag(USER_INFO,

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfigValidator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.hadoop.yarn.conf.YarnConfiguration;
2424
import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
2525
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
26+
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
2627
import org.slf4j.Logger;
2728
import org.slf4j.LoggerFactory;
2829

@@ -55,6 +56,8 @@ public static boolean validateCSConfiguration(
5556
return true;
5657
} finally {
5758
newCs.stop();
59+
QueueMetrics.clearQueueMetrics();
60+
liveScheduler.resetSchedulerMetrics();
5861
}
5962
}
6063

0 commit comments

Comments
 (0)