source: DCWoRMS/branches/coolemall/src/experiments/simpat2014/models/article/FCFSBF_RandomPlugin.java @ 1500

Revision 1500, 5.9 KB checked in by wojtekp, 10 years ago (diff)
Line 
1package experiments.simpat2014.models.article;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Map;
7import java.util.Random;
8
9import schedframe.events.scheduling.SchedulingEvent;
10import schedframe.events.scheduling.TaskFinishedEvent;
11import schedframe.resources.ResourceStatus;
12import schedframe.resources.StandardResourceType;
13import schedframe.resources.computing.ComputingResource;
14import schedframe.resources.computing.Core;
15import schedframe.resources.computing.Node;
16import schedframe.resources.computing.Processor;
17import schedframe.resources.computing.profiles.energy.ResourceEvent;
18import schedframe.resources.computing.profiles.energy.ResourceEventType;
19import schedframe.resources.computing.profiles.energy.airthroughput.CustomAirflowStateName;
20import schedframe.resources.computing.profiles.energy.power.CustomPowerStateName;
21import schedframe.resources.computing.profiles.energy.power.PowerState;
22import schedframe.resources.computing.profiles.energy.power.PowerUsage;
23import schedframe.resources.devices.Device;
24import schedframe.resources.devices.Fan;
25import schedframe.resources.units.ProcessingElements;
26import schedframe.resources.units.ResourceUnit;
27import schedframe.resources.units.ResourceUnitName;
28import schedframe.resources.units.StandardResourceUnitName;
29import schedframe.scheduling.ResourceItem;
30import schedframe.scheduling.manager.resources.ClusterResourceManager;
31import schedframe.scheduling.manager.resources.ResourceManager;
32import schedframe.scheduling.manager.tasks.JobRegistry;
33import schedframe.scheduling.manager.tasks.JobRegistryImpl;
34import schedframe.scheduling.plan.SchedulingPlanInterface;
35import schedframe.scheduling.plan.impl.SchedulingPlan;
36import schedframe.scheduling.plugin.ModuleList;
37import schedframe.scheduling.queue.TaskQueue;
38import schedframe.scheduling.queue.TaskQueueList;
39import schedframe.scheduling.tasks.TaskInterface;
40import simulator.DataCenterWorkloadSimulator;
41import dcworms.schedframe.scheduling.ExecTask;
42import eduni.simjava.Sim_system;
43import example.localplugin.BaseLocalSchedulingPlugin;
44import experiments.simpat2014.EnvironmentConditions;
45import gridsim.dcworms.DCWormsTags;
46
47public class FCFSBF_RandomPlugin extends BaseLocalSchedulingPlugin {
48
49        private Random rand;
50       
51        public FCFSBF_RandomPlugin() {
52                rand = new Random(5);
53        }
54
55        public SchedulingPlanInterface<?> schedule(SchedulingEvent event, TaskQueueList queues, JobRegistry jobRegistry,
56                        ResourceManager resManager, ModuleList modules) {
57
58                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
59                List<Node> nodes = resourceManager.getNodes();
60                SchedulingPlan plan = new SchedulingPlan();
61
62                // choose the events types to serve.
63                // Different actions for different events are possible.
64                switch (event.getType()) {
65               
66               
67                case TIMER:
68
69                        System.out.println("##########################" + Sim_system.clock());
70                        DataCenterWorkloadSimulator.getEventManager().sendToResources(StandardResourceType.Processor, 0.0, new ResourceEvent(ResourceEventType.TIMER, null));
71                        //DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(EnvironmentConditions.SYSTEM_UDPATE_INTERVAL, DCWormsTags.TIMER, "Test");
72                        break;
73                       
74                case START_TASK_EXECUTION:
75                case TASK_FINISHED:
76                        // our tasks are placed only in first queue (see BaseLocalSchedulingPlugin.placeJobsInQueues() method)
77                        TaskQueue q = queues.get(0);
78                        // check all tasks in queue
79                        for (int i = 0; i < q.size(); i++) {
80                                TaskInterface<?> task = q.get(i);
81                                // if status of the tasks in READY
82                                if (task.getStatus() == DCWormsTags.READY) {
83                                        Map<ResourceUnitName, ResourceUnit> choosenResources = chooseResourcesForExecution(nodes, task);
84                                        if (choosenResources != null) {
85                                                addToSchedulingPlan(plan, task, choosenResources);
86                                        } 
87                                }
88                        }
89
90                        break;
91
92                }       
93                return plan;
94        }
95       
96
97        private Map<ResourceUnitName, ResourceUnit> chooseResourcesForExecution(
98                        List<Node> nodes, TaskInterface<?> task) {
99
100                Map<ResourceUnitName, ResourceUnit> map = new HashMap<ResourceUnitName, ResourceUnit>(1);
101
102                int cpuRequest;
103                try {
104                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
105                } catch (NoSuchFieldException e) {
106                        cpuRequest = 0;
107                }
108
109                List<Node> filteredNodes = filterNodes(nodes, cpuRequest);
110                if(filteredNodes.size()==0)
111                        return null;
112                Node node = chooseRandomNode(filteredNodes);
113                while(node.getFreeCores().size() < cpuRequest){
114                        node = chooseRandomNode(nodes);
115                }
116               
117                if (cpuRequest != 0) {
118
119                        if (node.getFreeCores().size() < cpuRequest) {
120                                return null;
121                        }
122
123                        List<Core> cores = node.getCores();
124                        List<ComputingResource> choosenResources = new ArrayList<ComputingResource>(cpuRequest);                               
125                        for (int i = 0; i < cores.size() && cpuRequest > 0; i++) {
126                                if (cores.get(i).getStatus() == ResourceStatus.FREE) {
127                                        choosenResources.add(cores.get(i));
128                                        cpuRequest--;
129                                }
130                        }
131                        if (cpuRequest > 0) {
132                                return null;
133                        }
134
135                        ProcessingElements pe = new ProcessingElements();
136                        pe.addAll(choosenResources);
137                        map.put(StandardResourceUnitName.PE, pe);
138                        return map;
139                }
140
141                return null;
142        }
143
144
145        private List<Node> filterNodes(List<Node> nodes, int cpuRequest){
146                List<Node> filteredNodes = new ArrayList<Node>();
147
148                for (Node node : nodes) {
149
150                        if (cpuRequest != 0) {
151
152                                List<Core> cores = node.getCores();
153                                if (cores.size() < cpuRequest) {
154                                        if(cores.size() == 0){
155                                                if(node.getProcessors().size() < cpuRequest)
156                                                        continue;
157                                        }
158                                }
159
160                                int freeCores = 0;
161                                for(Core core: cores){
162                                        if(core.getStatus() == ResourceStatus.FREE)
163                                                freeCores++;
164                                }
165                               
166                                if(freeCores < cpuRequest)
167                                        continue;
168                               
169                                filteredNodes.add(node);
170                        }
171                }
172               
173                return filteredNodes;
174        }
175       
176
177        private Node chooseRandomNode(List<Node> nodes) {
178                int nodeIdx = rand.nextInt(nodes.size());
179                return nodes.get(nodeIdx);
180        }
181
182
183}
184
Note: See TracBrowser for help on using the repository browser.