Ver Fonte

YARN-10226. NPE in Capacity Scheduler while using %primary_group queue mapping. Contributed by Peter Bacsko.

(cherry picked from commit 6fb29d0f1710cbef021e58846eb5c67a8d0b1f87)
Sunil G há 5 anos atrás
pai
commit
94df6b513b

+ 10 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/UserGroupMappingPlacementRule.java

@@ -161,17 +161,19 @@ public class UserGroupMappingPlacementRule extends PlacementRule {
     String group =
         CapacitySchedulerConfiguration.ROOT + "." + getPrimaryGroup(user);
 
-    CSQueue parent = queueManager.getQueue(mapping.getParentQueue());
+    String parent = mapping.getParentQueue();
+    CSQueue groupQueue = queueManager.getQueue(group);
 
-    if (parent instanceof ManagedParentQueue) {
-      return getPlacementContext(mapping, group);
-    } else {
-      CSQueue queue = this.queueManager.getQueue(group);
-      if ( queue != null) {
-        return getPlacementContext(mapping, queue.getQueuePath());
+    if (parent != null) {
+      CSQueue parentQueue = queueManager.getQueue(parent);
+
+      if (parentQueue instanceof ManagedParentQueue) {
+        return getPlacementContext(mapping, group);
       } else {
-        return null;
+        return groupQueue == null ? null : getPlacementContext(mapping, group);
       }
+    } else {
+      return groupQueue == null ? null : getPlacementContext(mapping, group);
     }
   }
 

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

@@ -93,6 +93,7 @@ public class TestUserGroupMappingPlacementRule {
     when(queueManager.getQueue("bsubgroup2")).thenReturn(bsubgroup2);
     when(queueManager.getQueue("asubgroup2")).thenReturn(asubgroup2);
     when(queueManager.getQueue("managedParent")).thenReturn(managedParent);
+    when(queueManager.getQueue(null)).thenThrow(new NullPointerException());
 
     when(queueManager.getQueue("root.agroup")).thenReturn(agroup);
     when(queueManager.getQueue("root.bsubgroup2")).thenReturn(bsubgroup2);