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/policy/FifoComparator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/FifoComparator.java index 112c50ff1cc..c62b738df56 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/FifoComparator.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/FifoComparator.java @@ -29,6 +29,11 @@ @Override public int compare(SchedulableEntity r1, SchedulableEntity r2) { int res = r1.compareInputOrderTo(r2); + + if (res == 0) { + res = (int) Math.signum(r1.getStartTime() - r2.getStartTime()); + } + return res; } } 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/policy/TestFifoOrderingPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/TestFifoOrderingPolicy.java index 7ec2c01ec25..c512464391a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/TestFifoOrderingPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/TestFifoOrderingPolicy.java @@ -18,14 +18,13 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.policy; -import java.util.*; +import static org.junit.Assert.assertEquals; -import org.junit.Assert; -import org.junit.Test; +import java.util.Iterator; import org.apache.hadoop.yarn.api.records.Priority; - -import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Assert; +import org.junit.Test; public class TestFifoOrderingPolicy { @@ -36,13 +35,15 @@ public void testFifoOrderingPolicy() { MockSchedulableEntity r1 = new MockSchedulableEntity(); MockSchedulableEntity r2 = new MockSchedulableEntity(); - assertThat(policy.getComparator().compare(r1, r2)).isEqualTo(0); + assertEquals("Comparator Output", 0, + policy.getComparator().compare(r1, r2)); r1.setSerial(1); - assertThat(policy.getComparator().compare(r1, r2)).isEqualTo(1); + assertEquals("Comparator Output", 1, + policy.getComparator().compare(r1, r2)); r2.setSerial(2); - assertThat(policy.getComparator().compare(r1, r2)).isEqualTo(-1); + Assert.assertTrue(policy.getComparator().compare(r1, r2) < 0); } @Test @@ -63,7 +64,8 @@ public void testIterators() { schedOrder.addSchedulableEntity(msp3); //Assignment, oldest to youngest - checkSerials(schedOrder.getAssignmentIterator(IteratorSelector.EMPTY_ITERATOR_SELECTOR), new long[]{1, 2, 3}); + checkSerials(schedOrder.getAssignmentIterator( + IteratorSelector.EMPTY_ITERATOR_SELECTOR), new long[] { 1, 2, 3 }); //Preemption, youngest to oldest checkSerials(schedOrder.getPreemptionIterator(), new long[]{3, 2, 1}); @@ -72,8 +74,8 @@ public void testIterators() { public void checkSerials(Iterator si, long[] serials) { for (int i = 0;i < serials.length;i++) { - Assert.assertEquals(si.next().getSerial(), - serials[i]); + assertEquals("Comparator Order Output", si.next().getSerial(), + serials[i]); } } @@ -88,21 +90,47 @@ public void testFifoOrderingPolicyAlongWithPriorty() { Priority p2 = Priority.newInstance(0); // Both r1 and r1 priority is null - Assert.assertEquals(0, policy.getComparator().compare(r1, r2)); + assertEquals("Comparator Output", 0, + policy.getComparator().compare(r1, r2)); // r1 is null and r2 is not null r2.setApplicationPriority(p2); - Assert.assertEquals(-1, policy.getComparator().compare(r1, r2)); + Assert.assertTrue(policy.getComparator().compare(r1, r2) < 0); // r1 is not null and r2 is null r2.setApplicationPriority(null); r1.setApplicationPriority(p1); - Assert.assertEquals(1, policy.getComparator().compare(r1, r2)); + assertEquals("Comparator Output", 1, + policy.getComparator().compare(r1, r2)); // r1 is not null and r2 is not null r1.setApplicationPriority(p1); r2.setApplicationPriority(p2); - Assert.assertEquals(-1, policy.getComparator().compare(r1, r2)); + Assert.assertTrue(policy.getComparator().compare(r1, r2) < 0); } + @Test + public void testOrderingUsingAppSubmitTime() { + FifoOrderingPolicy policy = + new FifoOrderingPolicy(); + MockSchedulableEntity r1 = new MockSchedulableEntity(); + MockSchedulableEntity r2 = new MockSchedulableEntity(); + + // R1, R2 has been started at same time + assertEquals(r1.getStartTime(), r2.getStartTime()); + + // No changes, equal + assertEquals("Comparator Output", 0, + policy.getComparator().compare(r1, r2)); + + // R2 has been started after R1 + r1.setStartTime(5); + r2.setStartTime(10); + Assert.assertTrue(policy.getComparator().compare(r1, r2) < 0); + + // R1 has been started after R2 + r1.setStartTime(10); + r2.setStartTime(5); + Assert.assertTrue(policy.getComparator().compare(r1, r2) > 0); + } }