diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java index 6aee6a8f75d..d114a40cbb7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DirectoryCollection.java @@ -97,9 +97,9 @@ } // Good local storage directories - private List localDirs; - private List errorDirs; - private List fullDirs; + private CopyOnWriteArrayList localDirs; + private CopyOnWriteArrayList errorDirs; + private CopyOnWriteArrayList fullDirs; private Map directoryErrorInfo; // read/write lock for accessing above directories. @@ -275,7 +275,7 @@ void deregisterDirsChangeListener( List getGoodDirs() { this.readLock.lock(); try { - return ImmutableList.copyOf(localDirs); + return Collections.unmodifiableList(localDirs); } finally { this.readLock.unlock(); } @@ -287,7 +287,7 @@ void deregisterDirsChangeListener( List getFailedDirs() { this.readLock.lock(); try { - return ImmutableList.copyOf( + return Collections.unmodifiableList( DirectoryCollection.concat(errorDirs, fullDirs)); } finally { this.readLock.unlock(); @@ -300,7 +300,7 @@ void deregisterDirsChangeListener( List getFullDirs() { this.readLock.lock(); try { - return ImmutableList.copyOf(fullDirs); + return Collections.unmodifiableList(fullDirs); } finally { this.readLock.unlock(); } @@ -439,62 +439,61 @@ boolean checkDirs() { this.writeLock.lock(); try { - localDirs.clear(); - errorDirs.clear(); - fullDirs.clear(); directoryErrorInfo.clear(); - - for (Map.Entry entry : dirsFailedCheck - .entrySet()) { - String dir = entry.getKey(); - DiskErrorInformation errorInformation = entry.getValue(); - - switch (entry.getValue().cause) { - case DISK_FULL: - fullDirs.add(entry.getKey()); - break; - case OTHER: - errorDirs.add(entry.getKey()); - break; - default: - LOG.warn(entry.getValue().cause + " is unknown for disk error."); - break; - } - directoryErrorInfo.put(entry.getKey(), errorInformation); - - if (preCheckGoodDirs.contains(dir)) { - LOG.warn("Directory " + dir + " error, " + errorInformation.message - + ", removing from list of valid directories"); - setChanged = true; - numFailures++; - } - } for (String dir : allLocalDirs) { - if (!dirsFailedCheck.containsKey(dir)) { - localDirs.add(dir); - if (preCheckFullDirs.contains(dir) - || preCheckOtherErrorDirs.contains(dir)) { + if (dirsFailedCheck.containsKey(dir)) { + // Handle failed dirs + DiskErrorInformation errorInformation = dirsFailedCheck.get(dir); + if (preCheckGoodDirs.contains(dir)) { + localDirs.remove(dir); + LOG.warn("Directory " + dir + " error, " + errorInformation.message + + ", removing from list of valid directories"); + setChanged = true; + numFailures++; + } + switch (errorInformation.cause) { + case DISK_FULL: + if (!preCheckFullDirs.contains(dir)) { + fullDirs.addIfAbsent(dir); + if (preCheckOtherErrorDirs.contains(dir)) { + LOG.warn("Directory " + dir + " error " + + errorInformation.message); + } + } + break; + case OTHER: + if (!preCheckOtherErrorDirs.contains(dir)) { + errorDirs.addIfAbsent(dir); + if (preCheckFullDirs.contains(dir)) { + LOG.warn("Directory " + dir + " error " + + errorInformation.message); + } + } + break; + default: + LOG.warn("Directory " + dir + " cause " + + errorInformation.cause + " is unknown for disk error " + + errorInformation.message); + break; + } + directoryErrorInfo.put(dir, errorInformation); + } else { + // Handle good dirs + if (!preCheckGoodDirs.contains(dir)) { + localDirs.addIfAbsent(dir); setChanged = true; LOG.info("Directory " + dir + " passed disk check, adding to list of valid directories."); } - } - } - Set postCheckFullDirs = new HashSet(fullDirs); - Set postCheckOtherDirs = new HashSet(errorDirs); - for (String dir : preCheckFullDirs) { - if (postCheckOtherDirs.contains(dir)) { - LOG.warn("Directory " + dir + " error " - + dirsFailedCheck.get(dir).message); + if (preCheckFullDirs.contains(dir)) { + fullDirs.remove(dir); + } + if (preCheckOtherErrorDirs.contains(dir)) { + errorDirs.remove(dir); + } } } - for (String dir : preCheckOtherErrorDirs) { - if (postCheckFullDirs.contains(dir)) { - LOG.warn("Directory " + dir + " error " - + dirsFailedCheck.get(dir).message); - } - } setGoodDirsDiskUtilizationPercentage(); if (setChanged) { for (DirsChangeListener listener : dirsChangeListeners) {