Repository: hadoop Updated Branches: refs/heads/branch-2.6 c38c5752e -> bc6bc8025
HADOOP-11274. ConcurrentModificationException in Configuration Copy Constructor. Contributed by Junping Du. Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/bc6bc802 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/bc6bc802 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/bc6bc802 Branch: refs/heads/branch-2.6 Commit: bc6bc802515ac4f33a9617a4575fb1f0d09338ea Parents: c38c575 Author: Jing Zhao <ji...@apache.org> Authored: Thu Nov 6 16:07:50 2014 -0800 Committer: Jing Zhao <ji...@apache.org> Committed: Thu Nov 6 17:00:42 2014 -0800 ---------------------------------------------------------------------- hadoop-common-project/hadoop-common/CHANGES.txt | 3 + .../org/apache/hadoop/conf/Configuration.java | 85 +++++++++++--------- 2 files changed, 48 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/bc6bc802/hadoop-common-project/hadoop-common/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 1f78fb2..09e0bcd 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -496,6 +496,9 @@ Release 2.6.0 - UNRELEASED HADOOP-11253. Hadoop streaming test TestStreamXmlMultipleRecords fails on Windows. (Varun Vasudev via wheat9) + HADOOP-11274. ConcurrentModificationException in Configuration Copy Constructor. + (Junping Du via jing9) + BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS HADOOP-10734. Implement high-performance secure random number sources. http://git-wip-us.apache.org/repos/asf/hadoop/blob/bc6bc802/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java index 1276865..587f9c5 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java @@ -690,26 +690,26 @@ public class Configuration implements Iterable<Map.Entry<String,String>>, */ @SuppressWarnings("unchecked") public Configuration(Configuration other) { - this.resources = (ArrayList<Resource>) other.resources.clone(); - synchronized(other) { - if (other.properties != null) { - this.properties = (Properties)other.properties.clone(); - } - - if (other.overlay!=null) { - this.overlay = (Properties)other.overlay.clone(); - } - - this.updatingResource = new HashMap<String, String[]>(other.updatingResource); - this.finalParameters = new HashSet<String>(other.finalParameters); - } - + synchronized(other) { + this.resources = (ArrayList<Resource>) other.resources.clone(); + if (other.properties != null) { + this.properties = (Properties)other.properties.clone(); + } + + if (other.overlay!=null) { + this.overlay = (Properties)other.overlay.clone(); + } + + this.updatingResource = new HashMap<String, String[]>(other.updatingResource); + this.finalParameters = new HashSet<String>(other.finalParameters); + + this.classLoader = other.classLoader; + this.loadDefaults = other.loadDefaults; + setQuietMode(other.getQuietMode()); + } synchronized(Configuration.class) { REGISTRY.put(this, null); } - this.classLoader = other.classLoader; - this.loadDefaults = other.loadDefaults; - setQuietMode(other.getQuietMode()); } /** @@ -1019,26 +1019,28 @@ public class Configuration implements Iterable<Map.Entry<String,String>>, getProps().setProperty(name, value); String newSource = (source == null ? "programatically" : source); - if (!isDeprecated(name)) { - updatingResource.put(name, new String[] {newSource}); - String[] altNames = getAlternativeNames(name); - if(altNames != null) { - for(String n: altNames) { - if(!n.equals(name)) { - getOverlay().setProperty(n, value); - getProps().setProperty(n, value); - updatingResource.put(n, new String[] {newSource}); + synchronized (this) { + if (!isDeprecated(name)) { + updatingResource.put(name, new String[] {newSource}); + String[] altNames = getAlternativeNames(name); + if(altNames != null) { + for(String n: altNames) { + if(!n.equals(name)) { + getOverlay().setProperty(n, value); + getProps().setProperty(n, value); + updatingResource.put(n, new String[] {newSource}); + } } } } - } - else { - String[] names = handleDeprecation(deprecationContext.get(), name); - String altSource = "because " + name + " is deprecated"; - for(String n : names) { - getOverlay().setProperty(n, value); - getProps().setProperty(n, value); - updatingResource.put(n, new String[] {altSource}); + else { + String[] names = handleDeprecation(deprecationContext.get(), name); + String altSource = "because " + name + " is deprecated"; + for(String n : names) { + getOverlay().setProperty(n, value); + getProps().setProperty(n, value); + updatingResource.put(n, new String[] {altSource}); + } } } } @@ -2269,7 +2271,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>, * * @return final parameter set. */ - public Set<String> getFinalParameters() { + public synchronized Set<String> getFinalParameters() { return new HashSet<String>(finalParameters); } @@ -2532,14 +2534,18 @@ public class Configuration implements Iterable<Map.Entry<String,String>>, if (value != null) { if (!finalParameters.contains(attr)) { properties.setProperty(attr, value); - updatingResource.put(attr, source); + synchronized(this) { + updatingResource.put(attr, source); + } } else if (!value.equals(properties.getProperty(attr))) { LOG.warn(name+":an attempt to override final parameter: "+attr +"; Ignoring."); } } if (finalParameter) { - finalParameters.add(attr); + synchronized(this) { + finalParameters.add(attr); + } } } @@ -2733,7 +2739,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>, } @Override - public void readFields(DataInput in) throws IOException { + public synchronized void readFields(DataInput in) throws IOException { clear(); int size = WritableUtils.readVInt(in); for(int i=0; i < size; ++i) { @@ -2745,9 +2751,8 @@ public class Configuration implements Iterable<Map.Entry<String,String>>, } } - //@Override @Override - public void write(DataOutput out) throws IOException { + public synchronized void write(DataOutput out) throws IOException { Properties props = getProps(); WritableUtils.writeVInt(out, props.size()); for(Map.Entry<Object, Object> item: props.entrySet()) {