HADOOP-11274. ConcurrentModificationException in Configuration Copy Constructor. Contributed by Junping Du.

This commit is contained in:
Jing Zhao 2014-11-06 16:07:50 -08:00
parent 75b820cca9
commit 16b3482467
2 changed files with 46 additions and 38 deletions

View File

@ -910,6 +910,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.

View File

@ -690,8 +690,8 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
*/
@SuppressWarnings("unchecked")
public Configuration(Configuration other) {
this.resources = (ArrayList<Resource>) other.resources.clone();
synchronized(other) {
this.resources = (ArrayList<Resource>) other.resources.clone();
if (other.properties != null) {
this.properties = (Properties)other.properties.clone();
}
@ -702,15 +702,15 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
this.updatingResource = new HashMap<String, String[]>(other.updatingResource);
this.finalParameters = new HashSet<String>(other.finalParameters);
}
synchronized(Configuration.class) {
REGISTRY.put(this, null);
}
this.classLoader = other.classLoader;
this.loadDefaults = other.loadDefaults;
setQuietMode(other.getQuietMode());
}
synchronized(Configuration.class) {
REGISTRY.put(this, null);
}
}
/**
* Add a default resource. Resources are loaded in the order of the resources
@ -1025,6 +1025,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
getProps().setProperty(name, value);
String newSource = (source == null ? "programmatically" : source);
synchronized (this) {
if (!isDeprecated(name)) {
updatingResource.put(name, new String[] {newSource});
String[] altNames = getAlternativeNames(name);
@ -1048,6 +1049,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
}
}
}
}
private void warnOnceIfDeprecated(DeprecationContext deprecations, String name) {
DeprecatedKeyInfo keyInfo = deprecations.getDeprecatedKeyMap().get(name);
@ -2277,7 +2279,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);
}
@ -2540,16 +2542,20 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
if (value != null) {
if (!finalParameters.contains(attr)) {
properties.setProperty(attr, value);
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) {
synchronized(this) {
finalParameters.add(attr);
}
}
}
/**
* Write out the non-default properties in this configuration to the given
@ -2741,7 +2747,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) {
@ -2753,9 +2759,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()) {