package org.apache.hadoop.corona; import java.util.ArrayList; import java.util.Collections; import java.util.List; import junit.framework.Assert; import junit.framework.TestCase; public class TestScheduleComparator extends TestCase { public void testFairComparatorWithGrants() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // grants:1,2 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 0, 1.0, 0L)); Collections.sort(schedulables, ScheduleComparator.FAIR); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testFairComparatorWithWeights() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // weights:2.0,1.0 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 2.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 0, 1.0, 0L)); Collections.sort(schedulables, ScheduleComparator.FAIR); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testFairComparatorWithMin() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // min:10,0 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 9, 10, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 0, 0, 100.0, 0L)); Collections.sort(schedulables, ScheduleComparator.FAIR); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testFairComparatorWithBothUnderMin() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // grant:1,2 Min:2,3 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 3, 100.0, 0L)); Collections.sort(schedulables, ScheduleComparator.FAIR); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testFairComparatorWithTie() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // startTime:0,1 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 0.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 2, 0.0, 1L)); Collections.sort(schedulables, ScheduleComparator.FAIR); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testMinFairComparatorWithGrants() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // grants:1,2 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 1.0, 0L, 0, 2)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 0, 1.0, 0L, 0, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); schedulables.clear(); // Commutativity. schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 1.0, 0L, 0, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 0, 1.0, 0L, 0, 2)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s2", schedulables.get(0).getName()); Assert.assertEquals("s1", schedulables.get(1).getName()); schedulables.clear(); // Fair if equal priority schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 1.0, 0L, 0, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 0, 1.0, 0L, 0, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } /** * Neither of them needy. Different weights. */ public void testMinFairComparatorWithWeights() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // priority wins over weights schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 2.0, 0L, 0, 2)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 0, 1.0, 0L, 0, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); schedulables.clear(); // commutative schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 2.0, 0L, 0, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 0, 1.0, 0L, 0, 2)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s2", schedulables.get(0).getName()); Assert.assertEquals("s1", schedulables.get(1).getName()); schedulables.clear(); // Fair if equal priority. schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 2.0, 0L, 0, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 0, 1.0, 0L, 0, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } /** * One of the schedulables is needy. */ public void testMinFairComparatorWithMin() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // min:10,0 prty:1,2 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 9, 10, 1.0, 0L, 0, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 0, 0, 100.0, 0L, 0, 2)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); schedulables.clear(); // min:10,0 prty:2,1 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 9, 10, 1.0, 0L, 0, 2)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 0, 0, 100.0, 0L, 0, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); schedulables.clear(); // min:10,0 prty:1,1 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 9, 10, 1.0, 0L, 0, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 0, 0, 100.0, 0L, 0, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } /** * Both schedulables are needy. */ public void testMinFairComparatorWithBothUnderMin() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // grant:1,2 Min:2,3, prty:1,2 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 1.0, 0L, 1, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 3, 100.0, 0L, 1, 2)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); schedulables.clear(); // grant:1,2 Min:2,3, prty: 2,1, same result schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 1.0, 0L, 1, 2)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 3, 100.0, 0L, 1, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); schedulables.clear(); // grant:1,2 Min:2,3, prty: 1,1, same result schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 1.0, 0L, 1, 1)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 2, 3, 100.0, 0L, 1, 1)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testMinFairComparatorWithTie() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // startTime:0,1 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 0.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 2, 0.0, 0)); Collections.sort(schedulables, ScheduleComparator.PRIORITY); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testFifoComparator() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // startTime:0,1 schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 0, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 0, 2.0, 1L)); Collections.sort(schedulables, ScheduleComparator.FIFO); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testFifoComparatorWithTie() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // sorted by pool names in this case schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 1, 2, 1.0, 0L)); schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 1, 2, 1.0, 0L)); Collections.sort(schedulables, ScheduleComparator.FIFO); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } public void testDeadlineComparator() { // s2 has a deadline of 1 which is earler than s1, so it should run first List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 0, 0, 0, 2, 1, 0)); schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 0, 0, 0, 1, 2, 0)); Collections.sort(schedulables, ScheduleComparator.DEADLINE); Assert.assertEquals("s2", schedulables.get(0).getName()); Assert.assertEquals("s1", schedulables.get(1).getName()); } public void testDeadlineComparatorWithPriority() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); // S1 has priority of 2 so it will be scheduled first schedulables.add(new SchedulableForTest("s2", ResourceType.MAP, 0, 0, 0, 2, 1, 1)); schedulables.add(new SchedulableForTest("s1", ResourceType.MAP, 0, 0, 0, 1, 2, 2)); Collections.sort(schedulables, ScheduleComparator.DEADLINE); Assert.assertEquals("s1", schedulables.get(0).getName()); Assert.assertEquals("s2", schedulables.get(1).getName()); } private class SchedulableForTest extends Schedulable { final int granted, min, priority; final long startTime, deadline; final double weight; SchedulableForTest(String name, ResourceType type, int granted, int min, double weight, long startTime, long deadline, int priority) { super(name, type); this.granted = granted; this.min = min; this.weight = weight; this.startTime = startTime; this.deadline = deadline; this.priority = priority; } SchedulableForTest(String name, ResourceType type, int granted, int min, double weight, long startTime) { this(name, type, granted, min, weight, startTime, 0, 0); } @Override public int getGranted() { return granted; } @Override public double getWeight() { return weight; } @Override public int getMinimum() { return min; } @Override public long getStartTime() { return startTime; } @Override public int getRequested() { return 0; } @Override public void snapshot() { } @Override public long getDeadline() { return deadline; } @Override public int getPriority() { return priority; } } }