diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/ProportionalCapacityPreemptionPolicy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/ProportionalCapacityPreemptionPolicy.java index 1a3f804..da9d953 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/ProportionalCapacityPreemptionPolicy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/ProportionalCapacityPreemptionPolicy.java @@ -45,6 +45,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.PreemptableResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp; import org.apache.hadoop.yarn.util.Clock; @@ -112,9 +113,6 @@ public static final String NATURAL_TERMINATION_FACTOR = "yarn.resourcemanager.monitor.capacity.preemption.natural_termination_factor"; - public static final String BASE_YARN_RM_PREEMPTION = "yarn.scheduler.capacity."; - public static final String SUFFIX_DISABLE_PREEMPTION = ".disable_preemption"; - // the dispatcher to send preempt and kill events public EventHandler dispatcher; @@ -700,8 +698,9 @@ private TempQueue cloneQueues(CSQueue root, Resource clusterResources, Resource maxCapacity = Resources.multiply(clusterResources, absMaxCap); boolean queueDisablePreemption = false; - String queuePropName = BASE_YARN_RM_PREEMPTION + root.getQueuePath() - + SUFFIX_DISABLE_PREEMPTION; + String queuePropName = CapacitySchedulerConfiguration.PREFIX + + root.getQueuePath() + CapacitySchedulerConfiguration.DOT + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED; queueDisablePreemption = scheduler.getConfiguration() .getBoolean(queuePropName, parentDisablePreempt); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java index fc0fbb4..272fa84 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java @@ -78,6 +78,7 @@ private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); + private CapacitySchedulerContext context; public AbstractCSQueue(CapacitySchedulerContext cs, String queueName, CSQueue parent, CSQueue old) throws IOException { @@ -124,6 +125,8 @@ public AbstractCSQueue(CapacitySchedulerContext cs, maxCapacityByNodeLabels = cs.getConfiguration().getMaximumNodeLabelCapacities(getQueuePath(), accessibleLabels, labelManager); + + this.context = cs; } @Override @@ -447,4 +450,9 @@ public boolean getReservationContinueLooking() { public Map getACLs() { return acls; } + + @Private + public boolean isPreemptable() { + return context.getConfiguration().isPreemptable(getQueuePath()); + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java index 6438d6c..2c60111 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java @@ -292,4 +292,10 @@ public void attachContainer(Resource clusterResource, * @return capacity by node label */ public float getCapacityByNodeLabel(String nodeLabel); + + /** + * Get a queue's preemptability + * @return true if queue is preemptable, false if not + */ + public boolean isPreemptable(); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java index 5bbb436..3e9aa82 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java @@ -181,6 +181,12 @@ public static final boolean DEFAULT_ENABLE_QUEUE_MAPPING_OVERRIDE = false; @Private + public static final String QUEUE_PREEMPTION_DISABLED = "disable_preemption"; + + @Private + public static final boolean DEFAULT_QUEUE_PREEMPTION_DISABLED = false; + + @Private public static class QueueMapping { public enum MappingType { @@ -802,4 +808,29 @@ public long getEnforcementWindow(String queue) { DEFAULT_RESERVATION_ENFORCEMENT_WINDOW); return enforcementWindow; } + + public boolean isPreemptable(String qPath) { + boolean preemptable = + getBoolean(YarnConfiguration.RM_SCHEDULER_ENABLE_MONITORS, false); + // If the preemption feature is turned on, check all queues in the + // hierarchy to determine if preemption is disabled. + if (preemptable) { + if (qPath != null) { + StringTokenizer tokenizer = new StringTokenizer(qPath,DOT); + String qName = ""; + Boolean preemptionDisabled = false; + while(tokenizer.hasMoreTokens()){ + qName = qName + tokenizer.nextToken() + DOT; + String queuePropName = PREFIX + qName + QUEUE_PREEMPTION_DISABLED; + preemptionDisabled = getBoolean(queuePropName, preemptionDisabled); + } + // If preemption is disabled for this particular queue, then + // indicate that it is not preemptable. + if (preemptionDisabled) { + preemptable = false; + } + } + } + return preemptable; + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java index ffeec63..598dc9e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import java.util.TreeSet; import org.apache.commons.lang.StringUtils; @@ -177,7 +178,8 @@ public LeafQueue(CapacitySchedulerContext cs, .getConfiguration().getNodeLocalityDelay(), accessibleLabels, defaultLabelExpression, this.capacitiyByNodeLabels, this.maxCapacityByNodeLabels, - cs.getConfiguration().getReservationContinueLook()); + cs.getConfiguration().getReservationContinueLook(), + isPreemptable()); if(LOG.isDebugEnabled()) { LOG.debug("LeafQueue:" + " name=" + queueName @@ -208,7 +210,8 @@ protected synchronized void setupQueueConfigs( Set labels, String defaultLabelExpression, Map capacitieByLabel, Map maximumCapacitiesByLabel, - boolean revervationContinueLooking) throws IOException { + boolean revervationContinueLooking, + boolean preemptable) throws IOException { super.setupQueueConfigs(clusterResource, capacity, absoluteCapacity, maximumCapacity, absoluteMaxCapacity, state, acls, labels, defaultLabelExpression, capacitieByLabel, maximumCapacitiesByLabel, @@ -317,7 +320,8 @@ protected synchronized void setupQueueConfigs( "labels=" + labelStrBuilder.toString() + "\n" + "nodeLocalityDelay = " + nodeLocalityDelay + "\n" + "reservationsContinueLooking = " + - reservationsContinueLooking + "\n"); + reservationsContinueLooking + "\n" + + "preemptable = " + preemptable + "\n"); } @Override @@ -527,7 +531,8 @@ public synchronized void reinitialize( newlyParsedLeafQueue.defaultLabelExpression, newlyParsedLeafQueue.capacitiyByNodeLabels, newlyParsedLeafQueue.maxCapacityByNodeLabels, - newlyParsedLeafQueue.reservationsContinueLooking); + newlyParsedLeafQueue.reservationsContinueLooking, + newlyParsedLeafQueue.isPreemptable()); // queue metrics are updated, more resource may be available // activate the pending applications if possible diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java index 89b4a78..7a23081 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java @@ -121,7 +121,8 @@ protected void render(Block html) { _("Configured Minimum User Limit Percent:", Integer.toString(lqinfo.getUserLimit()) + "%"). _("Configured User Limit Factor:", String.format("%.1f", lqinfo.getUserLimitFactor())). _r("Active Users: ", activeUserList.toString()). - _("Accessible Node Labels:", StringUtils.join(",", lqinfo.getNodeLabels())); + _("Accessible Node Labels:", StringUtils.join(",", lqinfo.getNodeLabels())). + _("Preemptable:", lqinfo.isPreemptable()); html._(InfoBlock.class); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java index d90e963..f22ab7a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java @@ -37,6 +37,7 @@ protected int userLimit; protected UsersInfo users; // To add another level in the XML protected float userLimitFactor; + protected boolean preemptable; CapacitySchedulerLeafQueueInfo() { }; @@ -53,6 +54,7 @@ userLimit = q.getUserLimit(); users = new UsersInfo(q.getUsers()); userLimitFactor = q.getUserLimitFactor(); + preemptable = q.isPreemptable(); } public int getNumActiveApplications() { @@ -95,4 +97,8 @@ public UsersInfo getUsers() { public float getUserLimitFactor() { return userLimitFactor; } + + public boolean isPreemptable() { + return preemptable; + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TestProportionalCapacityPreemptionPolicy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TestProportionalCapacityPreemptionPolicy.java index ca67ef0..bb26684 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TestProportionalCapacityPreemptionPolicy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TestProportionalCapacityPreemptionPolicy.java @@ -17,17 +17,16 @@ */ package org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity; -import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.BASE_YARN_RM_PREEMPTION; import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.MAX_IGNORED_OVER_CAPACITY; import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.MONITORING_INTERVAL; import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.NATURAL_TERMINATION_FACTOR; import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.OBSERVE_ONLY; -import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.SUFFIX_DISABLE_PREEMPTION; import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.TOTAL_PREEMPTION_PER_ROUND; import static org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy.WAIT_TIME_BEFORE_KILL; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ContainerPreemptEventType.KILL_CONTAINER; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ContainerPreemptEventType.PREEMPT_CONTAINER; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -289,8 +288,8 @@ public void testPerQueueDisablePreemption() { { 3, 0, 0, 0 }, // subqueues }; - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueB" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueB." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); ProportionalCapacityPreemptionPolicy policy = buildPolicy(qData); policy.editSchedule(); @@ -305,8 +304,8 @@ public void testPerQueueDisablePreemption() { setup(); ProportionalCapacityPreemptionPolicy policy2 = buildPolicy(qData); - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueB" + SUFFIX_DISABLE_PREEMPTION, false); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueB." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, false); policy2.editSchedule(); verify(mDisp, times(4)).handle(argThat(new IsPreemptionRequestFor(appB))); @@ -343,8 +342,8 @@ public void testPerQueueDisablePreemptionHierarchical() { // Need to call setup() again to reset mDisp setup(); // Disable preemption for queueB and it's children - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueA.queueB" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueA.queueB." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); ProportionalCapacityPreemptionPolicy policy2 = buildPolicy(qData); policy2.editSchedule(); ApplicationAttemptId expectedAttemptOnQueueC = @@ -391,8 +390,8 @@ public void testPerQueueDisablePreemptionBroadHierarchical() { // Need to call setup() again to reset mDisp setup(); // Disable preemption for queueB(appA) - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueA.queueB" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueA.queueB." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); ProportionalCapacityPreemptionPolicy policy2 = buildPolicy(qData); policy2.editSchedule(); // Now that queueB(appA) is not preemptable, verify that resources come @@ -402,10 +401,10 @@ public void testPerQueueDisablePreemptionBroadHierarchical() { setup(); // Disable preemption for two of the 3 queues with over-capacity. - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueD.queueE" + SUFFIX_DISABLE_PREEMPTION, true); - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueA.queueB" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueD.queueE." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueA.queueB." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); ProportionalCapacityPreemptionPolicy policy3 = buildPolicy(qData); policy3.editSchedule(); @@ -446,8 +445,8 @@ public void testPerQueueDisablePreemptionInheritParent() { // Disable preemption for queueA and it's children. queueF(appC)'s request // should starve. setup(); // Call setup() to reset mDisp - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueA" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueA." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); ProportionalCapacityPreemptionPolicy policy2 = buildPolicy(qData); policy2.editSchedule(); verify(mDisp, never()).handle(argThat(new IsPreemptionRequestFor(appA))); // queueC @@ -471,8 +470,8 @@ public void testPerQueuePreemptionNotAllUntouchable() { { -1, -1, 1, 1, 1, -1, 1, 1, 1 }, // req granularity { 2, 3, 0, 0, 0, 3, 0, 0, 0 }, // subqueues }; - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root.queueA.queueC" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueA.queueC." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); ProportionalCapacityPreemptionPolicy policy = buildPolicy(qData); policy.editSchedule(); // Although queueC(appB) is way over capacity and is untouchable, @@ -497,8 +496,8 @@ public void testPerQueueDisablePreemptionRootDisablesAll() { }; ProportionalCapacityPreemptionPolicy policy = buildPolicy(qData); - schedConf.setBoolean(BASE_YARN_RM_PREEMPTION - + "root" + SUFFIX_DISABLE_PREEMPTION, true); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); policy.editSchedule(); // All queues should be non-preemptable, so request should starve. verify(mDisp, never()).handle(argThat(new IsPreemptionRequestFor(appB))); // queueC @@ -817,6 +816,52 @@ public void testAMResourcePercentForSkippedAMContainers() { setAMContainer = false; } + + @Test + public void testIsPreemptable() { + int[][] qData = new int[][] { + // / A D G + // B C E F H I + { 400, 200, 60, 140, 100, 70, 30, 100, 10, 90 }, // abs + { 400, 400, 400, 400, 400, 400, 400, 400, 400, 400 }, // maxCap + { 400, 210, 70, 140, 100, 50, 50, 90, 90, 0 }, // used + { 15, 0, 0, 0, 0, 0, 0, 0, 0, 15 }, // pending + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // reserved + // appA appB appC appD appE appF + { 6, 2, 1, 1, 2, 1, 1, 2, 1, 1 }, // apps + { -1, -1, 1, 1, -1, 1, 1, -1, 1, 1 }, // req granularity + { 3, 2, 0, 0, 2, 0, 0, 2, 0, 0 }, // subqueues + }; + schedConf.setBoolean(YarnConfiguration.RM_SCHEDULER_ENABLE_MONITORS, true); + ProportionalCapacityPreemptionPolicy policy = buildPolicy(qData); + policy.editSchedule(); + assertTrue("queueI should default to preemptable", + schedConf.isPreemptable("root.queueG.queueI")); + + // Disable preemption for root, then queueI should not be preemptable + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); + assertFalse("queueI should have inherited non-preemptability from root", + schedConf.isPreemptable("root.queueG.queueI")); + + // Enable preemption for root (grandparent) but dissable for queueG (parent), + // then queueI should not be preemptable + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, false); + schedConf.setBoolean(CapacitySchedulerConfiguration.PREFIX + "root.queueG." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, true); + assertFalse("queueI should have inherited non-preemptability from root", + schedConf.isPreemptable("root.queueG.queueI")); + + // Configure queueI to be preemptable even though preemption is disabled + // on queueG (parent). + schedConf.setBoolean( + CapacitySchedulerConfiguration.PREFIX + "root.queueG.queueI." + + CapacitySchedulerConfiguration.QUEUE_PREEMPTION_DISABLED, false); + assertTrue("queueI should have been configured to be preemptable", + schedConf.isPreemptable("root.queueG.queueI")); + } + static class IsPreemptionRequestFor extends ArgumentMatcher { private final ApplicationAttemptId appAttId; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java index c7c403d..388ef2d 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java @@ -353,7 +353,7 @@ private void verifySubQueue(JSONObject info, String q, int numExpectedElements = 13; boolean isParentQueue = true; if (!info.has("queues")) { - numExpectedElements = 23; + numExpectedElements = 24; isParentQueue = false; } assertEquals("incorrect number of elements", numExpectedElements, info.length());