.../localizer/ResourceLocalizationService.java | 36 +++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) 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 b417c5e..0aeaf5e 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/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 @@ -74,6 +74,7 @@ import org.apache.hadoop.service.AbstractService; import org.apache.hadoop.service.CompositeService; import org.apache.hadoop.util.DiskChecker; +import org.apache.hadoop.util.Shell; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -1474,7 +1475,18 @@ private boolean checkLocalDir(String localDir) { throw new YarnRuntimeException(msg, e); } - if (!status.getPermission().equals(entry.getValue())) { + // Relax the permission check on Windows as there are scenarios where + // user is equal to group (same identity e.g. in case of virtual + // accounts). + // In this case user permission will always be equal to group + // permission hence the umask match won't hold. + if (!status.getPermission().equals(entry.getValue()) + && !(Shell.WINDOWS + && isGroupEqualToOwnerOnWindows(status) + && status.getPermission().getUserAction() + .equals(entry.getValue().getUserAction()) && status + .getPermission().getOtherAction() + .equals(entry.getValue().getOtherAction()))) { String msg = "Permissions incorrectly set for dir " + entry.getKey() + ", should be " + entry.getValue() + ", actual value = " @@ -1485,7 +1497,29 @@ private boolean checkLocalDir(String localDir) { } 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();