From 593af878c006953a2df5da504e59aa65505db438 Mon Sep 17 00:00:00 2001 From: Szilard Nemeth Date: Thu, 21 May 2020 13:11:44 +0200 Subject: [PATCH] YARN-10108. FS-CS converter: nestedUserQueue with default rule results in invalid queue mapping. Contributed by Gergely Pollak --- .../scheduler/capacity/CapacityScheduler.java | 6 ++-- ...estCapacitySchedulerAutoQueueCreation.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java index 309fb60de6..5cef57adac 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java @@ -992,12 +992,14 @@ private void addApplication(ApplicationId applicationId, String queueName, // not auto-created above, then its parent queue should match // the parent queue specified in queue mapping } else if (!queue.getParent().getQueueShortName().equals( - placementContext.getParentQueue())) { + placementContext.getParentQueue()) + && !queue.getParent().getQueuePath().equals( + placementContext.getParentQueue())) { String message = "Auto created Leaf queue " + placementContext.getQueue() + " " + "already exists under queue : " + queue .getParent().getQueueShortName() - + ".But Queue mapping configuration " + + + ". But Queue mapping configuration " + CapacitySchedulerConfiguration.QUEUE_MAPPING + " has been " + "updated to a different parent queue : " + placementContext.getParentQueue() diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java index efe5c0248e..caf1df4d02 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java @@ -162,6 +162,35 @@ public void testAutoCreateLeafQueueCreation() throws Exception { } } + @Test(timeout = 20000) + public void testAutoCreateLeafQueueCreationUsingFullParentPath() + throws Exception { + + try { + setupGroupQueueMappings("root.d", cs.getConfiguration(), "%user"); + cs.reinitialize(cs.getConfiguration(), mockRM.getRMContext()); + + submitApp(mockRM, cs.getQueue("d"), TEST_GROUPUSER, TEST_GROUPUSER, 1, 1); + AutoCreatedLeafQueue autoCreatedLeafQueue = + (AutoCreatedLeafQueue) cs.getQueue(TEST_GROUPUSER); + ManagedParentQueue parentQueue = (ManagedParentQueue) cs.getQueue("d"); + assertEquals(parentQueue, autoCreatedLeafQueue.getParent()); + + Map expectedChildQueueAbsCapacity = + new HashMap() {{ + put(NO_LABEL, 0.02f); + }}; + + validateInitialQueueEntitlement(parentQueue, TEST_GROUPUSER, + expectedChildQueueAbsCapacity, + new HashSet() {{ add(NO_LABEL); }}); + + } finally { + cleanupQueue(USER0); + cleanupQueue(TEST_GROUPUSER); + } + } + @Test public void testReinitializeStoppedAutoCreatedLeafQueue() throws Exception { try {