1 package at.ac.tuwien.lsdc.sched;
4 import java.io.IOException;
5 import java.util.Collections;
6 import java.util.LinkedList;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
12 import at.ac.tuwien.lsdc.exception.OutOfPMsException;
13 import at.ac.tuwien.lsdc.exception.VMResizeException;
14 import at.ac.tuwien.lsdc.types.Application;
15 import at.ac.tuwien.lsdc.types.PhysicalMachine;
16 import at.ac.tuwien.lsdc.types.ScenarioType;
17 import at.ac.tuwien.lsdc.types.SchedulerEvent;
18 import at.ac.tuwien.lsdc.types.SchedulerType;
19 import at.ac.tuwien.lsdc.types.VirtualMachine;
20 import at.ac.tuwien.lsdc.types.VirtualMachine.VMType;
22 public class SchedulerC extends AbstractSchedulerWithMigration {
24 private static final Logger LOG = LoggerFactory.getLogger(SchedulerC.class);
26 public SchedulerC(int numPMs, int numCloudPartners, File schedulerLog, ScenarioType scenario)
28 super(numPMs, numCloudPartners, schedulerLog, scenario);
30 this.vmType = VMType.NonResizable;
34 protected boolean deployApp(VirtualMachine vm, Application app) {
35 boolean deployed = false;
36 if (!vm.enoughResources(app))
39 deployed = vm.startApplication(app);
46 * Cleanup completed apps. If an VM becomes empty, shut down VM + PM.
48 * @param events list of all events that happened in this timeslot.
51 protected void handleEndEvents(LinkedList<SchedulerEvent> events) {
52 LOG.debug("stopApps():" + events);
53 for (SchedulerEvent evt : events) {
54 VirtualMachine vm = evt.getApp().getRunningOn();
55 evt.getApp().setRunningOn(null);
56 vm.stopApplication(evt.getApp());
58 if (vm.getApplications().size() == 0) {
59 PhysicalMachine pm = vm.getRunningOn();
60 pm.stopVirtualMachine(vm);
61 manager.stopPhysicalMachine(pm.getId());
68 * Try to start all Apps. If not enough space start another PM, if not possible,
71 * @param events list of all events that happened in this timeslot.
74 protected void handleStartEvents(LinkedList<SchedulerEvent> events) {
75 LOG.debug("startApps():" + events);
76 boolean deployed = false;
77 for (SchedulerEvent evt : events) {
79 VirtualMachine vm = null;
80 List<PhysicalMachine> sortedPMs = manager.getSortedPMs();
81 Collections.reverse(sortedPMs);
82 for (PhysicalMachine pm : sortedPMs) {
83 if (pm.isRunning() && (pm.countCurrentlyRunningVMs() > 0)) {
84 vm = pm.getVirtualMachines().values().iterator().next();
85 deployed = deployApp(vm, evt.getApp());
92 vm = manager.startPhysicalMachine().startVirtualMachine(evt.getApp().getSize(),
93 evt.getApp().getRam(), evt.getApp().getCpu(), vmType);
94 deployed = deployApp(vm, evt.getApp());
95 } catch (OutOfPMsException e) {
96 if (federation.askToOutsource(evt.getApp())) {
97 insertOutsourcedStartEvent(currTime + 1, evt.getApp());
99 LOG.info("delaying the start of:" + evt.getApp());
100 delayedApps.add(evt.getApp());
106 insertStopEvent(currTime + evt.getApp().getDuration(), evt.getApp());
111 protected String getSchedulerType() {
112 return SchedulerType.C.toString();