source: DCWoRMS/trunk/src/test/article/recs/plugins/scheduling/old/RecsExclusivenessNodePowManSP.java @ 709

Revision 709, 5.3 KB checked in by wojtekp, 12 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package test.article.recs.plugins.scheduling.old;
2
3import gridsim.dcworms.DCWormsTags;
4
5import java.util.ArrayList;
6import java.util.HashMap;
7import java.util.List;
8import java.util.Map;
9
10import schedframe.events.scheduling.SchedulingEvent;
11import schedframe.resources.ResourceStatus;
12import schedframe.resources.computing.ComputingNode;
13import schedframe.resources.computing.ComputingResource;
14import schedframe.resources.computing.Core;
15import schedframe.resources.computing.Processor;
16import schedframe.resources.computing.profiles.energy.power.StandardPowerStateName;
17import schedframe.resources.units.ProcessingElements;
18import schedframe.resources.units.ResourceUnit;
19import schedframe.resources.units.ResourceUnitName;
20import schedframe.resources.units.StandardResourceUnitName;
21import schedframe.scheduling.manager.resources.ClusterResourceManager;
22import schedframe.scheduling.manager.resources.ResourceManager;
23import schedframe.scheduling.manager.tasks.JobRegistry;
24import schedframe.scheduling.plan.SchedulingPlanInterface;
25import schedframe.scheduling.plan.impl.SchedulingPlan;
26import schedframe.scheduling.plugin.grid.ModuleList;
27import schedframe.scheduling.queue.TaskQueue;
28import schedframe.scheduling.queue.TaskQueueList;
29import schedframe.scheduling.tasks.TaskInterface;
30import test.article.recs.plugins.scheduling.RecsSP;
31
32public class RecsExclusivenessNodePowManSP extends RecsSP {
33
34
35        public SchedulingPlanInterface<?> schedule(SchedulingEvent event, TaskQueueList queues, JobRegistry jobRegistry,
36                        ResourceManager resManager, ModuleList modules) {
37
38                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
39                SchedulingPlan plan = new SchedulingPlan();
40
41                switch (event.getType()) {
42                case START_TASK_EXECUTION:
43                case TASK_FINISHED:
44
45                        TaskQueue q = queues.get(0);
46
47                        for (int i = 0; i < q.size(); i++) {
48                                TaskInterface<?> task = q.get(i);
49                                initApplicationType(task);
50                               
51                                if (task.getStatus() == DCWormsTags.READY) {
52
53                                        Map<ResourceUnitName, ResourceUnit> choosenResources = chooseResourcesForExecution(resourceManager, task);
54                                        if (choosenResources  != null) {
55                                                addToSchedulingPlan(plan, task, choosenResources);
56                                        } else {
57                                                if(harnessIdleNodesToWork(task, resourceManager.getComputingNodes()))
58                                                        i--;
59                                        }
60                                }
61                        }
62                        turnOffIdleNodes(resourceManager.getComputingNodes());
63                        break;
64                }
65                return plan;
66        }
67       
68        private Map<ResourceUnitName, ResourceUnit> chooseResourcesForExecution(ClusterResourceManager resourceManager, TaskInterface<?> task) {
69
70                Map<ResourceUnitName, ResourceUnit> map = new HashMap<ResourceUnitName, ResourceUnit>();
71               
72                List<ComputingNode> nodes = resourceManager.getComputingNodes();
73                List<ComputingNode> avNodes = filterNodes(nodes, task);
74                if(avNodes.size() == 0)
75                        return null;
76
77                for(ComputingNode node: avNodes){
78                        int cpuRequest;
79                        try {
80                                cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
81                        } catch (NoSuchFieldException e) {
82                                cpuRequest = 0;
83                        }
84       
85                        if (cpuRequest != 0) {
86       
87                                List<Core> cores = node.getProcessors().get(0).getCores();
88                                List<ComputingResource> choosenResources = new ArrayList<ComputingResource>();                         
89                                for (int i = 0; i < cores.size() && cpuRequest > 0; i++) {
90                                        if (cores.get(i).getStatus() == ResourceStatus.FREE) {
91                                                choosenResources.add(cores.get(i));
92                                                cpuRequest--;
93                                        }
94                                }
95                                if (cpuRequest > 0) {
96                                        continue;
97                                }
98                                ProcessingElements pe = new ProcessingElements();
99                                pe.addAll(choosenResources);
100                                map.put(StandardResourceUnitName.PE, pe);
101                                return map;
102                        }
103                }
104                return null;
105        }
106
107        private void turnOffIdleNodes(List<ComputingNode> nodes){
108                for(ComputingNode node : nodes){
109                        Processor proc = node.getProcessors().get(0);
110                        int freeCores = 0;
111                        for(Core core: proc.getCores()){
112                                if(core.getStatus() == ResourceStatus.FREE)
113                                        freeCores++;
114                        }
115                       
116                        if(freeCores == proc.getCores().size())
117                                node.getPowerInterface().setPowerState(StandardPowerStateName.OFF);
118       
119                }
120        }
121       
122        private boolean harnessIdleNodesToWork(TaskInterface<?> task, List<ComputingNode> nodes){
123
124                int cpuRequest;
125                try {
126                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
127                } catch (NoSuchFieldException e) {
128                        cpuRequest = 0;
129                }
130                for (int i = 0; i < nodes.size(); i++) {
131                        ComputingNode node = nodes.get(i);
132                        if(node.getPowerInterface().getPowerState() == StandardPowerStateName.OFF){
133
134                                List<Core> cores = node.getProcessors().get(0).getCores();
135                                if (cores.size() < cpuRequest) {
136                                        continue;
137                                }
138                                node.getPowerInterface().setPowerState(StandardPowerStateName.ON);
139                                return true;
140                        }
141                }
142                return false;
143        }
144
145       
146        private List<ComputingNode> filterNodes(List<ComputingNode> nodes, TaskInterface<?> task){
147                List<ComputingNode> filteredNodes = new ArrayList<ComputingNode>();
148                for (ComputingNode node : nodes) {
149                        int cpuRequest;
150                        try {
151                                cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
152                        } catch (NoSuchFieldException e) {
153                                cpuRequest = 0;
154                        }
155
156                        if (cpuRequest != 0) {
157
158                                List<Core> cores = node.getProcessors().get(0).getCores();
159                                if (cores.size() < cpuRequest) {
160                                        continue;
161                                }
162
163                                int freeCores = 0;
164                                for(Core core: cores){
165                                        if(core.getStatus() == ResourceStatus.FREE)
166                                                freeCores++;
167                                }
168                               
169                                if(freeCores != cores.size())
170                                        continue;
171                               
172                                filteredNodes.add(node);
173                        }
174                }
175               
176                return filteredNodes;
177        }
178       
179}
Note: See TracBrowser for help on using the repository browser.