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/fair/TestFairSchedulerPreemption.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairSchedulerPreemption.java index 31630240e28..b381ffa7497 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairSchedulerPreemption.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairSchedulerPreemption.java @@ -402,6 +402,34 @@ public void testPreemptionSelectNonAMContainer() throws Exception { } @Test + public void testAppNotPreemptedBelowFairShare() throws Exception { + takeAllResources("root.preemptable.child-1"); + setNumAMContainersPerNode(1); + tryPreemptMoreThanFairShare("root.preemptable.child-2"); + } + + private void tryPreemptMoreThanFairShare(String queueName) + throws InterruptedException { + ApplicationAttemptId appAttemptId + = createSchedulingRequest(3 * GB, 3, queueName, "default", + NODE_CAPACITY_MULTIPLE * rmNodes.size() / 2); + starvingApp = scheduler.getSchedulerApp(appAttemptId); + + // Move clock enough to identify starvation + clock.tickSec(1); + scheduler.update(); + Thread.sleep(10000); + + // The total cluster memory is 8g, and the fair share of each queue is 4g. + // If we preempted more than 1 3g container, then we preempted greedyApp + // to below its fair share, which shouldn't be possible. + assertEquals(greedyApp.getLiveContainers().size(), 5); + + sendEnoughNodeUpdatesToAssignFully(); + assertEquals(starvingApp.getLiveContainers().size(), 1); + } + + @Test public void testPreemptionBetweenSiblingQueuesWithParentAtFairShare() throws InterruptedException { // Run this test only for fairshare preemption