Author: bobby Date: Wed Apr 25 20:54:27 2012 New Revision: 1330556 URL: http://svn.apache.org/viewvc?rev=1330556&view=rev Log: svn merge -c 1330552 FIXES: MAPREDUCE-4194. ConcurrentModificationError in DirectoryCollection (Jonathan Eagles via bobby)
Added: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestDirectoryCollection.java - copied unchanged from r1330552, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestDirectoryCollection.java Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt?rev=1330556&r1=1330555&r2=1330556&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt Wed Apr 25 20:54:27 2012 @@ -143,6 +143,9 @@ Release 0.23.3 - UNRELEASED MAPREDUCE-4133. MR over viewfs is broken (John George via bobby) + MAPREDUCE-4194. ConcurrentModificationError in DirectoryCollection + (Jonathan Eagles via bobby) + Release 0.23.2 - UNRELEASED INCOMPATIBLE CHANGES Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java?rev=1330556&r1=1330555&r2=1330556&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java Wed Apr 25 20:54:27 2012 @@ -19,10 +19,9 @@ package org.apache.hadoop.yarn.server.nodemanager; import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.Collections; import java.util.List; -import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -41,23 +40,22 @@ class DirectoryCollection { private int numFailures; public DirectoryCollection(String[] dirs) { - localDirs = new ArrayList<String>(); - localDirs.addAll(Arrays.asList(dirs)); - failedDirs = new ArrayList<String>(); + localDirs = new CopyOnWriteArrayList<String>(dirs); + failedDirs = new CopyOnWriteArrayList<String>(); } /** * @return the current valid directories */ synchronized List<String> getGoodDirs() { - return localDirs; + return Collections.unmodifiableList(localDirs); } /** * @return the failed directories */ synchronized List<String> getFailedDirs() { - return failedDirs; + return Collections.unmodifiableList(failedDirs); } /** @@ -75,22 +73,17 @@ class DirectoryCollection { */ synchronized boolean checkDirs() { int oldNumFailures = numFailures; - ListIterator<String> it = localDirs.listIterator(); - while (it.hasNext()) { - final String dir = it.next(); + for (final String dir : localDirs) { try { DiskChecker.checkDir(new File(dir)); } catch (DiskErrorException de) { LOG.warn("Directory " + dir + " error " + de.getMessage() + ", removing from the list of valid directories."); - it.remove(); + localDirs.remove(dir); failedDirs.add(dir); numFailures++; } } - if (numFailures > oldNumFailures) { - return true; - } - return false; + return numFailures > oldNumFailures; } }