diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/LocalResourcesTrackerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/LocalResourcesTrackerImpl.java index 7cf6b15..fdfc531 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/LocalResourcesTrackerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/LocalResourcesTrackerImpl.java @@ -300,7 +300,13 @@ private void decrementFileCountForLocalCacheDirectory(LocalResourceRequest req, /** * This module checks if the resource which was localized is already present - * or not + * or not. + * In the case where a disk has gone bad after + * a resource is localized on the disk, + * file.exists() still returns true and open() will + * fail at the time of access. + * So we need to check the file listing at the parent path. + * See: YARN-3591 * * @param rsrc * @return true/false based on resource is present or not @@ -308,10 +314,17 @@ private void decrementFileCountForLocalCacheDirectory(LocalResourceRequest req, public boolean isResourcePresent(LocalizedResource rsrc) { boolean ret = true; if (rsrc.getState() == ResourceState.LOCALIZED) { - File file = new File(rsrc.getLocalPath().toUri().getRawPath(). - toString()); + File file = new File(rsrc.getLocalPath().toUri().getRawPath().toString()); if (!file.exists()) { ret = false; + } else { + File rsrcParent = file.getParentFile(); + if (rsrcParent != null) { + String[] fileList = rsrcParent.list(); + ret = fileList != null && fileList.length > 0; + } else { + ret = false; + } } } return ret;