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/ResourceLocalizationService.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/ResourceLocalizationService.java index ddae2ae2727..89e11d8d973 100755 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.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/ResourceLocalizationService.java @@ -63,6 +63,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.fs.UnsupportedFileSystemException; +import org.apache.hadoop.fs.permission.FsAction; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.ipc.Server; import org.apache.hadoop.security.Credentials; @@ -74,6 +75,7 @@ import org.apache.hadoop.util.DiskChecker; import org.apache.hadoop.util.DiskValidator; import org.apache.hadoop.util.DiskValidatorFactory; +import org.apache.hadoop.util.Shell; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.concurrent.HadoopExecutors; import org.apache.hadoop.util.concurrent.HadoopScheduledThreadPoolExecutor; @@ -1637,7 +1639,8 @@ private boolean checkLocalDir(String localDir) { throw new YarnRuntimeException(msg, e); } - if (!status.getPermission().equals(entry.getValue())) { + if (!status.getPermission().equals(entry.getValue()) && + !checkLocalDirWindows(status, entry.getValue())) { String msg = "Permissions incorrectly set for dir " + entry.getKey() + ", should be " + entry.getValue() + ", actual value = " @@ -1649,6 +1652,50 @@ private boolean checkLocalDir(String localDir) { return true; } + private static boolean checkLocalDirWindows( + final FileStatus status, final FsPermission fsPermission) { + if (!Shell.WINDOWS) { + return false; + } + if (!isGroupEqualToOwnerOnWindows(status)) { + return false; + } + FsAction userAction = status.getPermission().getUserAction(); + if (!userAction.equals(fsPermission.getUserAction())) { + + return false; + } + FsAction otherAction = status.getPermission().getOtherAction(); + if (!otherAction.equals(fsPermission.getOtherAction())) { + return false; + } + return true; + } + + private static boolean isGroupEqualToOwnerOnWindows(FileStatus status) { + String owner = status.getOwner(); + String group = status.getGroup(); + + if (owner.equals(group)) { + return true; + } + + String domainSeperator = "\\"; + + if (group.contains(domainSeperator) && !owner.contains(domainSeperator)) { + // In Windows virtual account, the group is NT SERVICE\\username owner is + // userName + // So compare only the username of owner and group + int index = group.indexOf(domainSeperator); + String groupUserName = group.substring(index + 1, group.length()); + if (groupUserName.equals(owner)) { + return true; + } + } + + return false; + } + private Map getLocalDirsPathPermissionsMap(String localDir) { Map localDirPathFsPermissionsMap = new HashMap();