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.ActiveApplicationsException;
13 import at.ac.tuwien.lsdc.exception.VMsRunningException;
14 import at.ac.tuwien.lsdc.types.Application;
15 import at.ac.tuwien.lsdc.types.ApplicationResourceComparator;
16 import at.ac.tuwien.lsdc.types.PhysicalMachine;
17 import at.ac.tuwien.lsdc.types.ScenarioType;
18 import at.ac.tuwien.lsdc.types.SchedulerEvent;
19 import at.ac.tuwien.lsdc.types.SchedulerType;
20 import at.ac.tuwien.lsdc.types.VirtualMachine;
21 import at.ac.tuwien.lsdc.types.VirtualMachine.VMType;
23 public class SchedulerA extends AbstractScheduler {
25 private static final Logger log = LoggerFactory.getLogger(SchedulerA.class);
27 public SchedulerA(int numPMs, int numCloudPartners, File schedulerLog, ScenarioType scenario)
29 super(numPMs, numCloudPartners, schedulerLog, scenario);
31 this.vmType = VMType.NonResizable;
35 protected void handleEndEvents(LinkedList<SchedulerEvent> events) {
36 for (SchedulerEvent evt : events) {
37 VirtualMachine vm = evt.getApp().getRunningOn();
38 vm.stopApplication(evt.getApp());
39 PhysicalMachine pm = vm.getRunningOn();
41 pm.stopVirtualMachine(vm);
42 if (pm.countCurrentlyRunningVMs() == 0) {
44 manager.stopPhysicalMachine(pm.getId());
45 } catch (VMsRunningException e) {
46 log.warn("PM " + pm.getId() + " could not be stopped, " + e.getMessage());
49 log.info("application stopped at timestamp " + currTime + ", " + "vm "
50 + vm.getPositionOnPM() + ", pm " + pm.getId());
51 } catch (ActiveApplicationsException e) {
52 log.warn("VM " + vm.getId() + "could not be stopped, " + e.getMessage());
58 protected void handleDelayedApps() {
59 // TODO Auto-generated method stub
64 protected void handleStartEvents(LinkedList<SchedulerEvent> events) {
65 // sorting applications by amount of resources (descending)
66 List<Application> sortedApps = sortApps(events);
68 for (Application app : sortedApps) {
69 boolean appDeployed = false;
71 if (manager.getPMs().size() == 0) {
72 PhysicalMachine pm = manager.startPhysicalMachine();
73 boolean enoughResources = pm.checkVM(app.getSize(), app.getRam(), app.getCpu());
75 if (enoughResources) {
76 VirtualMachine vm = pm.startVirtualMachine(app.getSize(), app.getRam(),
77 app.getCpu(), vmType);
78 vm.startApplication(app);
79 insertStopEvent(currTime + app.getDuration(), app);
81 log.info("Application " + app.toString() + " started on new pm " + pm.getId());
83 log.warn("Application " + app.toString() + " cannot be run on empty pm "
87 // sorting physical machines by resource utilization
89 List<PhysicalMachine> sortedPMs = sortPMs();
91 for (PhysicalMachine pm : sortedPMs) {
93 boolean enoughResources = pm.checkVM(app.getSize(), app.getRam(), app.getCpu());
95 if (enoughResources) {
96 VirtualMachine vm = pm.startVirtualMachine(app.getSize(), app.getRam(),
97 app.getCpu(), vmType);
98 vm.startApplication(app);
99 insertStopEvent(currTime + app.getDuration(), app);
101 log.info("Application " + app.toString() + " started new vm "
102 + vm.getPositionOnPM() + " on pm " + pm.getId());
106 if (!appDeployed && (manager.getPMs().size() < manager.getMaxPMs())) {
108 PhysicalMachine pm = manager.startPhysicalMachine();
109 boolean enoughResources = pm.checkVM(app.getSize(), app.getRam(), app.getCpu());
111 if (enoughResources) {
112 VirtualMachine vm = pm.startVirtualMachine(app.getSize(), app.getRam(),
113 app.getCpu(), vmType);
114 vm.startApplication(app);
115 insertStopEvent(currTime + app.getDuration(), app);
117 log.info("Application " + app.toString() + " started on new pm "
120 log.warn("Application " + app.toString() + " cannot be run on empty pm "
126 if (federation.askToOutsource(app)) {
127 insertOutsourcedStartEvent(currTime + 1, app);
130 delayedApps.add(app);
133 log.warn("Application " + app.toString() + " could not be deployed on any pm");
139 protected void runMigration() {
140 // Scheduler A doesn't support Migration, nothing to do here
143 // sorting applications by amount of resources (descending)
144 private List<Application> sortApps(LinkedList<SchedulerEvent> events) {
145 List<Application> sortedApps = new LinkedList<Application>();
146 for (SchedulerEvent evt : events) {
147 sortedApps.add(evt.getApp());
149 Collections.sort(sortedApps, new ApplicationResourceComparator());
150 Collections.reverse(sortedApps);
154 // sorting physical machines by resource utilization (descending)
155 private List<PhysicalMachine> sortPMs() {
156 List<PhysicalMachine> sortedPMs = new LinkedList<PhysicalMachine>();
157 for (PhysicalMachine pm : manager.getPMs()) {
159 // log.info("pm util = "+pm.getAverageUtilization());
162 Collections.sort(sortedPMs);
163 Collections.reverse(sortedPMs);
168 protected String getSchedulerType() {
169 return SchedulerType.A.toString();