package uk.ac.imperial.lsds.seepmaster.scheduler;
import java.util.Properties;
import java.util.Set;
import org.junit.Test;
import uk.ac.imperial.lsds.seep.api.operator.SeepLogicalQuery;
import uk.ac.imperial.lsds.seep.scheduler.Stage;
import uk.ac.imperial.lsds.seep.scheduler.StageType;
import uk.ac.imperial.lsds.seepmaster.MasterConfig;
import uk.ac.imperial.lsds.seepmaster.query.ScheduledQueryManager;
public class SequentialSchedulingStrategyTest {
private ScheduledQueryManager boilerplate(){
// Create schedule for one query with SequentialSchedulingStrategy
Properties p = new Properties();
p.setProperty("scheduling.strategy.type", "0");
p.setProperty("properties.file", "/dev/null");
MasterConfig mc = new MasterConfig(p);
ComplexBranchingQuery fb = new ComplexBranchingQuery();
SeepLogicalQuery lsq = fb.compose();
ScheduledQueryManager se = ScheduledQueryManager.getInstance(null, null,null, mc, (short)0);
se.buildSchedulingPlanForQuery(lsq);
// Set schedulerEngine ready to start
se.__initializeEverything();
return se;
}
@Test
public void testStageLifecycle() {
ScheduledQueryManager se = boilerplate();
ScheduleTracker tracker = se.__tracker_for_test();
Set<Stage> ready = tracker.getReadySet();
System.out.println("ready stages: "+ready.size());
for(Stage s : ready) {
System.out.println("Stage READY: "+s.getStageId());
tracker.setFinished(s, null);
}
Set<Stage> ready2 = tracker.getReadySet();
System.out.println("ready stages: "+ready2.size());
for(Stage s : ready2) {
System.out.println("Stage READY: "+s.getStageId());
tracker.setFinished(s, null);
}
}
@Test
public void testCorrectness(){
ScheduledQueryManager se = boilerplate();
ScheduleTracker tracker = se.__tracker_for_test();
Set<Stage> ready = tracker.getReadySet();
System.out.println("ready stages: "+ready.size());
for(Stage s : ready) {
System.out.println("Stage READY: "+s.getStageId());
}
boolean finished = false;
while(!finished) {
Stage next = se.__get_next_stage_to_schedule_fot_test();
tracker.setFinished(next, null);
if(next.getStageType().equals(StageType.SINK_STAGE)) {
finished = true;
}
System.out.println("schedule -> "+next.getStageId());
}
}
@Test
public void testLocalSchedulingSpeed() {
ScheduledQueryManager se = boilerplate();
// Attempt to make the following number of schedules by reseting the query as necessary
ScheduleTracker tracker = se.__tracker_for_test();
int numSchedules = 100000;
long start = System.currentTimeMillis();
while(numSchedules > 0) {
Stage next = se.__get_next_stage_to_schedule_fot_test();
tracker.setFinished(next, null);
if(next.getStageType().equals(StageType.SINK_STAGE)) {
se.__reset_schedule();
se.__initializeEverything();
}
numSchedules--;
}
long stop = System.currentTimeMillis();
System.out.println("total time to schedule: "+numSchedules+" -> "+(stop-start)+" ms");
}
@Test
public void testLocalSchedulingSpeedWithLargerQuery() {
// Create schedule for one query with SequentialSchedulingStrategy
Properties p = new Properties();
p.setProperty("scheduling.strategy.type", "0");
p.setProperty("properties.file", "/dev/null");
MasterConfig mc = new MasterConfig(p);
ComplexManyBranchesMultipleSourcesQuery fb = new ComplexManyBranchesMultipleSourcesQuery();
SeepLogicalQuery lsq = fb.compose();
ScheduledQueryManager se = ScheduledQueryManager.getInstance(null, null,null, mc, (short)0);
se.buildSchedulingPlanForQuery(lsq);
// Set schedulerEngine ready to start
se.__initializeEverything();
// Attempt to make the following number of schedules by reseting the query as necessary
ScheduleTracker tracker = se.__tracker_for_test();
int numSchedules = 100000;
long start = System.currentTimeMillis();
while(numSchedules > 0) {
Stage next = se.__get_next_stage_to_schedule_fot_test();
tracker.setFinished(next, null);
if(next.getStageType().equals(StageType.SINK_STAGE)) {
se.__reset_schedule();
se.__initializeEverything();
}
numSchedules--;
}
long stop = System.currentTimeMillis();
System.out.println("total time to schedule (larger): "+numSchedules+" -> "+(stop-start)+" ms");
/**
* 0.5 sec for 100K schedules in a crappy machine. Let's assume linear time growth ->
* 1 sec for 200K. 1sec/200K = 0.000005. Tasks plus network latency should be below 50us, hmmmmm we're fine.
*/
}
}