diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationFileLoaderService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationFileLoaderService.java index cd4a19b..22384ec 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationFileLoaderService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationFileLoaderService.java @@ -487,6 +487,7 @@ private void loadQueue(String parentName, Element element, Map racls = new HashMap<>(); NodeList fields = element.getChildNodes(); boolean isLeaf = true; + boolean isReservable = false; for (int j = 0; j < fields.getLength(); j++) { Node fieldNode = fields.item(j); @@ -558,7 +559,7 @@ private void loadQueue(String parentName, Element element, racls.put(ReservationACL.SUBMIT_RESERVATIONS, new AccessControlList(text)); } else if ("reservation".equals(field.getTagName())) { - isLeaf = false; + isReservable = true; reservableQueues.add(queueName); configuredQueues.get(FSQueueType.PARENT).add(queueName); } else if ("allowPreemptionFrom".equals(field.getTagName())) { @@ -577,22 +578,19 @@ private void loadQueue(String parentName, Element element, isLeaf = false; } } - if (isLeaf) { - // if a leaf in the alloc file is marked as type='parent' - // then store it under 'parent' - if ("parent".equals(element.getAttribute("type"))) { - configuredQueues.get(FSQueueType.PARENT).add(queueName); - } else { - configuredQueues.get(FSQueueType.LEAF).add(queueName); - } + + // if a leaf in the alloc file is marked as type='parent' + // then store it as a parent queue + if (isLeaf && !"parent".equals(element.getAttribute("type"))) { + configuredQueues.get(FSQueueType.LEAF).add(queueName); } else { - if ("parent".equals(element.getAttribute("type"))) { - throw new AllocationConfigurationException("Both and " + - "type=\"parent\" found for queue " + queueName + " which is " + - "unsupported"); + if (isReservable) { + throw new AllocationConfigurationException("Can't mark " + + "to a parent queue: " + queueName); } configuredQueues.get(FSQueueType.PARENT).add(queueName); } + // Set default acls if not defined // The root queue defaults to all access for (QueueACL acl : QueueACL.values()) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java index 12c3fa9..0388cc2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java @@ -618,6 +618,74 @@ public void testQueueNameContainingOnlyWhitespace() throws Exception { allocLoader.reloadAllocations(); } + @Test (expected = AllocationConfigurationException.class) + public void testParentTagWithReservation() throws Exception { + Configuration conf = new Configuration(); + conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE); + + PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE)); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.close(); + + AllocationFileLoaderService allocLoader = new AllocationFileLoaderService(); + allocLoader.init(conf); + ReloadListener confHolder = new ReloadListener(); + allocLoader.setReloadListener(confHolder); + allocLoader.reloadAllocations(); + } + + @Test (expected = AllocationConfigurationException.class) + public void testParentWithReservation() throws Exception { + Configuration conf = new Configuration(); + conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE); + + PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE)); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(" "); + out.println(" "); + out.println(""); + out.println(""); + out.close(); + + AllocationFileLoaderService allocLoader = new AllocationFileLoaderService(); + allocLoader.init(conf); + ReloadListener confHolder = new ReloadListener(); + allocLoader.setReloadListener(confHolder); + allocLoader.reloadAllocations(); + } + + @Test + public void testParentTagWithChild() throws Exception { + Configuration conf = new Configuration(); + conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE); + + PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE)); + out.println(""); + out.println(""); + out.println(""); + out.println(" "); + out.println(" "); + out.println(""); + out.println(""); + out.close(); + + AllocationFileLoaderService allocLoader = new AllocationFileLoaderService(); + allocLoader.init(conf); + ReloadListener confHolder = new ReloadListener(); + allocLoader.setReloadListener(confHolder); + allocLoader.reloadAllocations(); + } + /** * Verify that you can't have the queue name with just a non breaking * whitespace in the allocations file.