diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/UserGroupMappingPlacementRule.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/UserGroupMappingPlacementRule.java index 6dce9c76c91..4d93d3d79da 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/UserGroupMappingPlacementRule.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/UserGroupMappingPlacementRule.java @@ -72,6 +72,16 @@ public UserGroupMappingPlacementRule(boolean overrideWithQueueMappings, this.groups = groups; } + private String getPrimaryGroup(String user) throws IOException { + String group = groups.getGroups(user).get(0); + CSQueue csQueue = this.queueManager.getQueue(group); + if (csQueue != null) { + return group; + } + + return null; + } + private String getSecondaryGroup(String user) throws IOException { List groupsList = groups.getGroups(user); String secondaryGroup = null; @@ -92,76 +102,47 @@ private String getSecondaryGroup(String user) throws IOException { return secondaryGroup; } - private ApplicationPlacementContext getPlacementForUser(String user) + private ApplicationPlacementContext getPlacementForUser( + String user) throws IOException { for (QueueMapping mapping : mappings) { if (mapping.getType() == MappingType.USER) { + if (isCurrentUserToGroupParentMapping(mapping)) { + String group; + if (mapping.getParentQueue().equals(PRIMARY_GROUP_MAPPING)) { + group = getPrimaryGroup(user); + } else { + group = getSecondaryGroup(user); + } + + if (group != null) { + QueueMapping queueMapping = + QueueMappingBuilder.create() + .type(mapping.getType()) + .source(mapping.getSource()) + .queue(user) + .parentQueue(group) + .build(); + validateQueueMapping(queueMapping); + return getPlacementContext(queueMapping, user); + } else { + return null; + } + } if (mapping.getSource().equals(CURRENT_USER_MAPPING)) { - if (mapping.getParentQueue() != null - && mapping.getParentQueue().equals(PRIMARY_GROUP_MAPPING) - && mapping.getQueue().equals(CURRENT_USER_MAPPING)) { - if (this.queueManager - .getQueue(groups.getGroups(user).get(0)) != null) { - QueueMapping queueMapping = - QueueMappingBuilder.create() - .type(mapping.getType()) - .source(mapping.getSource()).queue(user) - .parentQueue(groups.getGroups(user).get(0)) - .build(); - validateQueueMapping(queueMapping); - return getPlacementContext(queueMapping, user); - } else { - return null; - } - } else if (mapping.getParentQueue() != null - && mapping.getParentQueue().equals(SECONDARY_GROUP_MAPPING) - && mapping.getQueue().equals(CURRENT_USER_MAPPING)) { - String secondaryGroup = getSecondaryGroup(user); - if (secondaryGroup != null) { - QueueMapping queueMapping = - QueueMappingBuilder.create() - .type(mapping.getType()) - .source(mapping.getSource()) - .queue(user) - .parentQueue(secondaryGroup) - .build(); - validateQueueMapping(queueMapping); - return getPlacementContext(queueMapping, user); - } else { - return null; - } - } else if (mapping.getQueue().equals(CURRENT_USER_MAPPING)) { + if (mapping.getQueue().equals(CURRENT_USER_MAPPING)) { return getPlacementContext(mapping, user); - } else if (mapping.getQueue().equals(PRIMARY_GROUP_MAPPING)) { - if (this.queueManager - .getQueue(groups.getGroups(user).get(0)) != null) { - return getPlacementContext(mapping, - groups.getGroups(user).get(0)); - } else { - return null; - } - } else if (mapping.getQueue().equals(SECONDARY_GROUP_MAPPING)) { - String secondaryGroup = getSecondaryGroup(user); - if (secondaryGroup != null) { - return getPlacementContext(mapping, secondaryGroup); - } else { - return null; - } - } else { - return getPlacementContext(mapping); } } - if (user.equals(mapping.getSource())) { - if (mapping.getQueue().equals(PRIMARY_GROUP_MAPPING)) { + if (user.equals(mapping.getSource()) + || mapping.getSource().equals(CURRENT_USER_MAPPING)) { + switch (mapping.getQueue()) { + case PRIMARY_GROUP_MAPPING: return getPlacementContext(mapping, groups.getGroups(user).get(0)); - } else if (mapping.getQueue().equals(SECONDARY_GROUP_MAPPING)) { - String secondaryGroup = getSecondaryGroup(user); - if (secondaryGroup != null) { - return getPlacementContext(mapping, secondaryGroup); - } else { - return null; - } - } else { + case SECONDARY_GROUP_MAPPING: + return getNullablePlacementContext( + mapping, getSecondaryGroup(user)); + default: return getPlacementContext(mapping); } } @@ -180,6 +161,14 @@ private ApplicationPlacementContext getPlacementForUser(String user) return null; } + private boolean isCurrentUserToGroupParentMapping(QueueMapping queueMapping) { + return queueMapping.getSource().equals(CURRENT_USER_MAPPING) + && queueMapping.getParentQueue() != null + && (queueMapping.getParentQueue().equals(PRIMARY_GROUP_MAPPING) + || queueMapping.getParentQueue().equals(SECONDARY_GROUP_MAPPING)) + && queueMapping.getQueue().equals(CURRENT_USER_MAPPING); + } + @Override public ApplicationPlacementContext getPlacementForApp( ApplicationSubmissionContext asc, String user) @@ -210,6 +199,15 @@ public ApplicationPlacementContext getPlacementForApp( return null; } + private ApplicationPlacementContext getNullablePlacementContext( + QueueMapping queueMapping, String queue) { + if (queue!= null) { + return getPlacementContext(queueMapping, queue); + } else { + return null; + } + } + private ApplicationPlacementContext getPlacementContext( QueueMapping mapping) { return getPlacementContext(mapping, mapping.getQueue());