Browse Source

YARN-10409. Improve MockQueueHierarchyBuilder to detect queue ambiguity. Contributed by Gergely Pollak

Szilard Nemeth 4 years ago
parent
commit
a888d580d8

+ 18 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/placement/MockQueueHierarchyBuilder.java

@@ -19,11 +19,13 @@
 package org.apache.hadoop.yarn.server.resourcemanager.placement;
 
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import org.apache.commons.compress.utils.Lists;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -33,6 +35,8 @@ class MockQueueHierarchyBuilder {
   private static final String QUEUE_SEP = ".";
   private List<String> queuePaths = Lists.newArrayList();
   private List<String> managedParentQueues = Lists.newArrayList();
+  private Set<String> ambiguous = Sets.newHashSet();
+  private Map<String, String> shortNameMapping = Maps.newHashMap();
   private CapacitySchedulerQueueManager queueManager;
 
   public static MockQueueHierarchyBuilder create() {
@@ -75,6 +79,14 @@ class MockQueueHierarchyBuilder {
     for (String queuePath : queuePaths) {
       addQueues(queues, queuePath);
     }
+
+    ambiguous.forEach(queue -> {
+      if (queue.equals("root")) {
+        return;
+      }
+      when(queueManager.isAmbiguous(queue)).thenReturn(true);
+      when(queueManager.getQueue(queue)).thenReturn(null);
+    });
   }
 
   private void addQueues(Map<String, AbstractCSQueue> queues,
@@ -89,6 +101,12 @@ class MockQueueHierarchyBuilder {
       currentQueuePath += currentQueuePath.equals("") ?
           queueName : QUEUE_SEP + queueName;
 
+      if (shortNameMapping.containsKey(queueName) &&
+          !shortNameMapping.get(queueName).equals(currentQueuePath)) {
+        ambiguous.add(queueName);
+      }
+      shortNameMapping.put(queueName, currentQueuePath);
+
       if (managedParentQueues.contains(parentPath) && !isLeaf) {
         throw new IllegalStateException("Cannot add a queue under " +
             "managed parent");

+ 2 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/placement/TestUserGroupMappingPlacementRule.java

@@ -84,7 +84,6 @@ public class TestUserGroupMappingPlacementRule {
         .build();
 
     when(queueManager.getQueue(isNull())).thenReturn(null);
-    when(queueManager.isAmbiguous("primarygrouponly")).thenReturn(true);
     rule.setQueueManager(queueManager);
     ApplicationSubmissionContext asc = Records.newRecord(
         ApplicationSubmissionContext.class);
@@ -349,7 +348,7 @@ public class TestUserGroupMappingPlacementRule {
             .build());
   }
 
-  @Test(expected = YarnException.class)
+  @Test
   public void testUserMappingToNestedUserPrimaryGroupWithAmbiguousQueues()
       throws YarnException {
     // u:%user:%user, submitter nosecondarygroupuser, queue is ambiguous
@@ -362,6 +361,7 @@ public class TestUserGroupMappingPlacementRule {
                 .parentQueue("%primary_group")
                 .build())
             .inputUser("nosecondarygroupuser")
+            .expectedQueue("default")
             .build());
   }