From b5b81a4f086126974c75dab9b54aea20a0c1a48f Mon Sep 17 00:00:00 2001 From: bibinchundatt Date: Sat, 18 Nov 2017 19:25:29 +0530 Subject: [PATCH] YARN-7489. ConcurrentModificationException in RMAppImpl#getRMAppMetrics. Contributed by Tao Yang. --- .../resourcemanager/rmapp/RMAppImpl.java | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java index 85d355fe007..689625410da 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java @@ -1641,35 +1641,39 @@ public RMAppMetrics getRMAppMetrics() { int numNonAMContainerPreempted = 0; Map resourceSecondsMap = new HashMap<>(); Map preemptedSecondsMap = new HashMap<>(); - - for (RMAppAttempt attempt : attempts.values()) { - if (null != attempt) { - RMAppAttemptMetrics attemptMetrics = - attempt.getRMAppAttemptMetrics(); - Resources.addTo(resourcePreempted, - attemptMetrics.getResourcePreempted()); - numAMContainerPreempted += attemptMetrics.getIsPreempted() ? 1 : 0; - numNonAMContainerPreempted += - attemptMetrics.getNumNonAMContainersPreempted(); - // getAggregateAppResourceUsage() will calculate resource usage stats - // for both running and finished containers. - AggregateAppResourceUsage resUsage = - attempt.getRMAppAttemptMetrics().getAggregateAppResourceUsage(); - for (Map.Entry entry : resUsage - .getResourceUsageSecondsMap().entrySet()) { - long value = RMServerUtils - .getOrDefault(resourceSecondsMap, entry.getKey(), 0L); - value += entry.getValue(); - resourceSecondsMap.put(entry.getKey(), value); - } - for (Map.Entry entry : attemptMetrics - .getPreemptedResourceSecondsMap().entrySet()) { - long value = RMServerUtils - .getOrDefault(preemptedSecondsMap, entry.getKey(), 0L); - value += entry.getValue(); - preemptedSecondsMap.put(entry.getKey(), value); + this.readLock.lock(); + try { + for (RMAppAttempt attempt : attempts.values()) { + if (null != attempt) { + RMAppAttemptMetrics attemptMetrics = + attempt.getRMAppAttemptMetrics(); + Resources.addTo(resourcePreempted, + attemptMetrics.getResourcePreempted()); + numAMContainerPreempted += attemptMetrics.getIsPreempted() ? 1 : 0; + numNonAMContainerPreempted += + attemptMetrics.getNumNonAMContainersPreempted(); + // getAggregateAppResourceUsage() will calculate resource usage stats + // for both running and finished containers. + AggregateAppResourceUsage resUsage = + attempt.getRMAppAttemptMetrics().getAggregateAppResourceUsage(); + for (Map.Entry entry : resUsage + .getResourceUsageSecondsMap().entrySet()) { + long value = RMServerUtils + .getOrDefault(resourceSecondsMap, entry.getKey(), 0L); + value += entry.getValue(); + resourceSecondsMap.put(entry.getKey(), value); + } + for (Map.Entry entry : attemptMetrics + .getPreemptedResourceSecondsMap().entrySet()) { + long value = RMServerUtils + .getOrDefault(preemptedSecondsMap, entry.getKey(), 0L); + value += entry.getValue(); + preemptedSecondsMap.put(entry.getKey(), value); + } } } + } finally { + this.readLock.unlock(); } return new RMAppMetrics(resourcePreempted, numNonAMContainerPreempted,