package org.apache.hadoop.corona; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; public class TestDistributeShare extends TestCase { final double ERROR = 0.01; final int MAX = Integer.MAX_VALUE; public void testDistributeFifoShare() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 10, 0, 0, MAX, 1.0, 1L)); schedulables.add(new SchedulableForTest("s2", 5, 0, 0, MAX, 1.0, 2L)); schedulables.add(new SchedulableForTest("s3", 2, 0, 0, MAX, 1.0, 3L)); schedulables.add(new SchedulableForTest("s4", 1, 0, 0, MAX, 1.0, 4L)); Schedulable.distributeShare(16, schedulables, ScheduleComparator.FIFO); assertEquals(10, schedulables.get(0).getShare(), ERROR); assertEquals(5, schedulables.get(1).getShare(), ERROR); assertEquals(1, schedulables.get(2).getShare(), ERROR); assertEquals(0, schedulables.get(3).getShare(), ERROR); } public void testDistributeFairShareWithWeight() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 10, 0, 0, MAX, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", 10, 0, 0, MAX, 2.0, 0L)); schedulables.add(new SchedulableForTest("s3", 10, 0, 0, MAX, 3.0, 0L)); schedulables.add(new SchedulableForTest("s4", 10, 0, 0, MAX, 4.0, 0L)); Schedulable.distributeShare(16, schedulables, ScheduleComparator.FAIR); assertEquals(1.0 / 10 * 16, schedulables.get(0).getShare(), ERROR); assertEquals(2.0 / 10 * 16, schedulables.get(1).getShare(), ERROR); assertEquals(3.0 / 10 * 16, schedulables.get(2).getShare(), ERROR); assertEquals(4.0 / 10 * 16, schedulables.get(3).getShare(), ERROR); } public void testDistributeFairShareWithMaxCap() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 10, 0, 0, 1, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", 10, 0, 0, 2, 2.0, 0L)); schedulables.add(new SchedulableForTest("s3", 10, 0, 0, MAX, 3.0, 0L)); schedulables.add(new SchedulableForTest("s4", 10, 0, 0, MAX, 4.0, 0L)); Schedulable.distributeShare(16, schedulables, ScheduleComparator.FAIR); assertEquals(1.0, schedulables.get(0).getShare(), ERROR); assertEquals(2.0, schedulables.get(1).getShare(), ERROR); assertEquals(3.0 / 7 * (16 - 3), schedulables.get(2).getShare(), ERROR); assertEquals(4.0 / 7 * (16 - 3), schedulables.get(3).getShare(), ERROR); } public void testDistributeFairShareWithRequestCap() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 1, 0, 0, MAX, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", 2, 0, 0, MAX, 2.0, 0L)); schedulables.add(new SchedulableForTest("s3", 10, 0, 0, MAX, 3.0, 0L)); schedulables.add(new SchedulableForTest("s4", 10, 0, 0, MAX, 4.0, 0L)); Schedulable.distributeShare(16, schedulables, ScheduleComparator.FAIR); assertEquals(1.0, schedulables.get(0).getShare(), ERROR); assertEquals(2.0, schedulables.get(1).getShare(), ERROR); assertEquals(3.0 / 7 * (16 - 3), schedulables.get(2).getShare(), ERROR); assertEquals(4.0 / 7 * (16 - 3), schedulables.get(3).getShare(), ERROR); } public void testDistributeFairShareWithMin() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 10, 0, 3, MAX, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", 10, 0, 7, MAX, 2.0, 0L)); schedulables.add(new SchedulableForTest("s3", 10, 0, 0, MAX, 3.0, 0L)); schedulables.add(new SchedulableForTest("s4", 10, 0, 0, MAX, 4.0, 0L)); Schedulable.distributeShare(16, schedulables, ScheduleComparator.FAIR); assertEquals(3.0, schedulables.get(0).getShare(), ERROR); assertEquals(7.0, schedulables.get(1).getShare(), ERROR); assertEquals(3.0 / 7 * (16 - 10), schedulables.get(2).getShare(), ERROR); assertEquals(4.0 / 7 * (16 - 10), schedulables.get(3).getShare(), ERROR); } public void testDistributeFairShareWithNotActiveLimits() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 10, 0, 1, 4, 1.0, 0L)); schedulables.add(new SchedulableForTest("s2", 10, 0, 2, 5, 2.0, 0L)); schedulables.add(new SchedulableForTest("s3", 10, 0, 3, 6, 3.0, 0L)); schedulables.add(new SchedulableForTest("s4", 10, 0, 4, 7, 4.0, 0L)); Schedulable.distributeShare(16, schedulables, ScheduleComparator.FAIR); assertEquals(1.0 / 10 * 16, schedulables.get(0).getShare(), ERROR); assertEquals(2.0 / 10 * 16, schedulables.get(1).getShare(), ERROR); assertEquals(3.0 / 10 * 16, schedulables.get(2).getShare(), ERROR); assertEquals(4.0 / 10 * 16, schedulables.get(3).getShare(), ERROR); } /** * Total share < sum(min) && Total share > sum(demand) */ public void testDistributeMinFairShareWayUnderAllocatedOptimistic() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 5, 0, 10, 40, 1.0, 0L, 3)); schedulables.add(new SchedulableForTest("s2", 5, 0, 20, 50, 2.0, 0L, 3)); schedulables.add(new SchedulableForTest("s3", 5, 0, 30, 60, 3.0, 0L, 2)); schedulables.add(new SchedulableForTest("s4", 5, 0, 40, 70, 4.0, 0L, 1)); Schedulable.distributeShare(30, schedulables, ScheduleComparator.PRIORITY); assertEquals(10, schedulables.get(0).getShare(), ERROR); assertEquals(20, schedulables.get(1).getShare(), ERROR); assertEquals(30, schedulables.get(2).getShare(), ERROR); assertEquals(40, schedulables.get(3).getShare(), ERROR); } /** * Total share < sum(min) && Total share < sum(demand) */ public void testDistributeMinFairShareWayUnderAllocatedPessimistic() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 10, 0, 10, 40, 1.0, 0L, 3)); schedulables.add(new SchedulableForTest("s2", 10, 0, 20, 50, 2.0, 0L, 3)); schedulables.add(new SchedulableForTest("s3", 10, 0, 30, 60, 3.0, 0L, 2)); schedulables.add(new SchedulableForTest("s4", 10, 0, 40, 70, 4.0, 0L, 1)); Schedulable.distributeShare(30, schedulables, ScheduleComparator.PRIORITY); assertEquals(10, schedulables.get(0).getShare(), ERROR); assertEquals(20, schedulables.get(1).getShare(), ERROR); assertEquals(30, schedulables.get(2).getShare(), ERROR); assertEquals(40, schedulables.get(3).getShare(), ERROR); } /** * Total share > sum(max or demand) */ public void testDistributeMinFairShareWayOverAllocated() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 15, 0, 10, 40, 1.0, 0L, 3)); schedulables.add(new SchedulableForTest("s2", 25, 0, 20, 50, 2.0, 0L, 3)); schedulables.add(new SchedulableForTest("s3", 35, 0, 30, 60, 3.0, 0L, 2)); schedulables.add(new SchedulableForTest("s4", 45, 0, 40, 70, 4.0, 0L, 1)); Schedulable.distributeShare(250, schedulables, ScheduleComparator.PRIORITY); assertEquals(15, schedulables.get(0).getShare(), ERROR); assertEquals(25, schedulables.get(1).getShare(), ERROR); assertEquals(35, schedulables.get(2).getShare(), ERROR); assertEquals(45, schedulables.get(3).getShare(), ERROR); } /** * Total share < sum(demand) && Total > sum(min) */ public void testDistributeMinFairShareOverAllocated() { List<Schedulable> schedulables = new ArrayList<Schedulable>(); schedulables.add(new SchedulableForTest("s1", 15, 0, 10, 40, 1.0, 0L, 3)); schedulables.add(new SchedulableForTest("s2", 25, 0, 20, 50, 2.0, 0L, 2)); schedulables.add(new SchedulableForTest("s3", 35, 0, 30, 60, 3.0, 0L, 2)); schedulables.add(new SchedulableForTest("s4", 45, 0, 40, 70, 4.0, 0L, 1)); Schedulable.distributeShare(110, schedulables, ScheduleComparator.PRIORITY); assertEquals(15, schedulables.get(0).getShare(), ERROR); assertEquals(22, schedulables.get(1).getShare(), ERROR); assertEquals(33, schedulables.get(2).getShare(), ERROR); assertEquals(40, schedulables.get(3).getShare(), ERROR); } private class SchedulableForTest extends Schedulable { final int requested, granted, min, max; final long startTime; final double weight; final int priority; SchedulableForTest(String name, int requested, int granted, int min, int max, double weight, long startTime) { super(name, ResourceType.MAP); this.requested = requested; this.granted = granted; this.min = min; this.max = max; this.weight = weight; this.startTime = startTime; this.priority = 0; } SchedulableForTest(String name, int requested, int granted, int min, int max, double weight, long startTime, int priority) { super(name, ResourceType.MAP); this.requested = requested; this.granted = granted; this.min = min; this.max = max; this.weight = weight; this.startTime = startTime; this.priority = priority; } @Override public int getGranted() { return granted; } @Override public double getWeight() { return weight; } @Override public int getMinimum() { return min; } @Override public int getMaximum() { return max; } @Override public long getStartTime() { return startTime; } @Override public long getDeadline() { return -1L; } @Override public int getPriority() { return priority; } @Override public int getRequested() { return requested; } @Override public void snapshot() { } } }