Author: tomwhite
Date: Mon May 31 23:46:53 2010
New Revision: 949901
URL: http://svn.apache.org/viewvc?rev=949901&view=rev
Log:
Merge -r 949895:949896 from trunk to 0.20 branch. Fixes: MAPREDUCE-1372
Modified:
hadoop/common/branches/branch-0.20/CHANGES.txt
hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java
Modified: hadoop/common/branches/branch-0.20/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/CHANGES.txt?rev=949901&r1=949900&r2=949901&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.20/CHANGES.txt Mon May 31 23:46:53 2010
@@ -29,6 +29,9 @@ Release 0.20.3 - Unreleased
HDFS-909. Wait until edits syncing is finishes before purging edits.
(Todd Lipcon via shv)
+ MAPREDUCE-1372. ConcurrentModificationException in JobInProgress.
+ (Dick King and Amareshwari Sriramadasu via tomwhite)
+
IMPROVEMENTS
MAPREDUCE-1407. Update javadoc in mapreduce.{Mapper,Reducer} to match
Modified:
hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java?rev=949901&r1=949900&r2=949901&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java
(original)
+++
hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java
Mon May 31 23:46:53 2010
@@ -117,7 +117,15 @@ public class JobTracker implements MRCon
private DNSToSwitchMapping dnsToSwitchMapping;
private NetworkTopology clusterMap = new NetworkTopology();
private int numTaskCacheLevels; // the max level to which we cache tasks
- private Set<Node> nodesAtMaxLevel = new HashSet<Node>();
+ /**
+ * {...@link #nodesAtMaxLevel} is using the keySet from {...@link
ConcurrentHashMap}
+ * so that it can be safely written to and iterated on via 2 separate
threads.
+ * Note: It can only be iterated from a single thread which is feasible since
+ * the only iteration is done in {...@link JobInProgress} under the
+ * {...@link JobTracker} lock.
+ */
+ private Set<Node> nodesAtMaxLevel =
+ Collections.newSetFromMap(new ConcurrentHashMap<Node, Boolean>());
private final TaskScheduler taskScheduler;
private final List<JobInProgressListener> jobInProgressListeners =
new CopyOnWriteArrayList<JobInProgressListener>();
@@ -2388,25 +2396,27 @@ public class JobTracker implements MRCon
}
private Node addHostToNodeMapping(String host, String networkLoc) {
- Node node;
- if ((node = clusterMap.getNode(networkLoc+"/"+host)) == null) {
- node = new NodeBase(host, networkLoc);
- clusterMap.add(node);
- if (node.getLevel() < getNumTaskCacheLevels()) {
- LOG.fatal("Got a host whose level is: " + node.getLevel() + "."
- + " Should get at least a level of value: "
- + getNumTaskCacheLevels());
- try {
- stopTracker();
- } catch (IOException ie) {
- LOG.warn("Exception encountered during shutdown: "
- + StringUtils.stringifyException(ie));
- System.exit(-1);
+ Node node = null;
+ synchronized (nodesAtMaxLevel) {
+ if ((node = clusterMap.getNode(networkLoc+"/"+host)) == null) {
+ node = new NodeBase(host, networkLoc);
+ clusterMap.add(node);
+ if (node.getLevel() < getNumTaskCacheLevels()) {
+ LOG.fatal("Got a host whose level is: " + node.getLevel() + "."
+ + " Should get at least a level of value: "
+ + getNumTaskCacheLevels());
+ try {
+ stopTracker();
+ } catch (IOException ie) {
+ LOG.warn("Exception encountered during shutdown: "
+ + StringUtils.stringifyException(ie));
+ System.exit(-1);
+ }
}
+ hostnameToNodeMap.put(host, node);
+ // Make an entry for the node at the max level in the cache
+ nodesAtMaxLevel.add(getParentNode(node, getNumTaskCacheLevels() - 1));
}
- hostnameToNodeMap.put(host, node);
- // Make an entry for the node at the max level in the cache
- nodesAtMaxLevel.add(getParentNode(node, getNumTaskCacheLevels() - 1));
}
return node;
}