From a0305ba3fcf3c7fd5285aac4117ca80538988f89 Mon Sep 17 00:00:00 2001 From: Jason Lowe Date: Tue, 30 Sep 2014 22:37:28 +0000 Subject: [PATCH] YARN-2387. Resource Manager crashes with NPE due to lack of synchronization. Contributed by Mit Desai (cherry picked from commit feaf139b4f327d33011e5a4424c06fb44c630955) --- hadoop-yarn-project/CHANGES.txt | 3 +++ .../impl/pb/ContainerStatusPBImpl.java | 22 +++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index c7731450d4b..017ce10d0e6 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -455,6 +455,9 @@ Release 2.6.0 - UNRELEASED YARN-2610. Hamlet should close table tags. (Ray Chiang via kasha) + YARN-2387. Resource Manager crashes with NPE due to lack of + synchronization (Mit Desai via jlowe) + Release 2.5.1 - 2014-09-05 INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java index 8e3e2cca386..86f2af95a19 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java @@ -50,7 +50,7 @@ public class ContainerStatusPBImpl extends ContainerStatus { viaProto = true; } - public ContainerStatusProto getProto() { + public synchronized ContainerStatusProto getProto() { mergeLocalToProto(); proto = viaProto ? proto : builder.build(); viaProto = true; @@ -90,7 +90,7 @@ public class ContainerStatusPBImpl extends ContainerStatus { } } - private void mergeLocalToProto() { + private synchronized void mergeLocalToProto() { if (viaProto) maybeInitBuilder(); mergeLocalToBuilder(); @@ -98,7 +98,7 @@ public class ContainerStatusPBImpl extends ContainerStatus { viaProto = true; } - private void maybeInitBuilder() { + private synchronized void maybeInitBuilder() { if (viaProto || builder == null) { builder = ContainerStatusProto.newBuilder(proto); } @@ -107,7 +107,7 @@ public class ContainerStatusPBImpl extends ContainerStatus { @Override - public ContainerState getState() { + public synchronized ContainerState getState() { ContainerStatusProtoOrBuilder p = viaProto ? proto : builder; if (!p.hasState()) { return null; @@ -116,7 +116,7 @@ public class ContainerStatusPBImpl extends ContainerStatus { } @Override - public void setState(ContainerState state) { + public synchronized void setState(ContainerState state) { maybeInitBuilder(); if (state == null) { builder.clearState(); @@ -125,7 +125,7 @@ public class ContainerStatusPBImpl extends ContainerStatus { builder.setState(convertToProtoFormat(state)); } @Override - public ContainerId getContainerId() { + public synchronized ContainerId getContainerId() { ContainerStatusProtoOrBuilder p = viaProto ? proto : builder; if (this.containerId != null) { return this.containerId; @@ -138,32 +138,32 @@ public class ContainerStatusPBImpl extends ContainerStatus { } @Override - public void setContainerId(ContainerId containerId) { + public synchronized void setContainerId(ContainerId containerId) { maybeInitBuilder(); if (containerId == null) builder.clearContainerId(); this.containerId = containerId; } @Override - public int getExitStatus() { + public synchronized int getExitStatus() { ContainerStatusProtoOrBuilder p = viaProto ? proto : builder; return p.getExitStatus(); } @Override - public void setExitStatus(int exitStatus) { + public synchronized void setExitStatus(int exitStatus) { maybeInitBuilder(); builder.setExitStatus(exitStatus); } @Override - public String getDiagnostics() { + public synchronized String getDiagnostics() { ContainerStatusProtoOrBuilder p = viaProto ? proto : builder; return (p.getDiagnostics()); } @Override - public void setDiagnostics(String diagnostics) { + public synchronized void setDiagnostics(String diagnostics) { maybeInitBuilder(); builder.setDiagnostics(diagnostics); }