source: DCWoRMS/trunk/build/classes/example/localplugin/FCFSNodePowerManagementClusterLocalPlugin.java @ 539

Revision 539, 5.4 KB checked in by wojtekp, 12 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package example.localplugin;
2
3import gridsim.dcworms.DCWormsTags;
4
5import java.util.ArrayList;
6import java.util.Collections;
7import java.util.Comparator;
8import java.util.HashMap;
9import java.util.List;
10import java.util.Map;
11
12import schedframe.events.scheduling.SchedulingEvent;
13import schedframe.resources.ResourceStatus;
14import schedframe.resources.computing.ComputingNode;
15import schedframe.resources.computing.ComputingResource;
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 schedframe.scheduling.tasks.WorkloadUnit;
31
32public class FCFSNodePowerManagementClusterLocalPlugin extends BaseLocalSchedulingPlugin {
33
34        public FCFSNodePowerManagementClusterLocalPlugin () {
35        }
36
37        public SchedulingPlanInterface<?> schedule(SchedulingEvent event, TaskQueueList queues, JobRegistry jobRegistry,
38                        ResourceManager resManager, ModuleList modules) {
39
40                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
41                SchedulingPlan plan = new SchedulingPlan();
42
43                switch (event.getType()) {
44                case START_TASK_EXECUTION:
45                case TASK_FINISHED:
46
47                        TaskQueue q = queues.get(0);
48
49                        for (int i = 0; i < q.size(); i++) {
50                                WorkloadUnit job = q.get(i);
51                                TaskInterface<?> task = (TaskInterface<?>) job;
52                                if (task.getStatus() == DCWormsTags.READY) {
53
54                                        Map<ResourceUnitName, ResourceUnit> choosenResources = chooseResourcesForExecution(resourceManager, task);
55                                        if (choosenResources  != null) {
56                                                addToSchedulingPlan(plan, task, choosenResources);
57                                        } else {
58                                                if(harnessIdleNodesToWork(task, resourceManager.getComputingNodes()))
59                                                        i--;
60                                        }
61                                }
62                        }
63                        turnOffIdleNodes(resourceManager.getComputingNodes());
64                        break;
65                }
66                return plan;
67        }
68       
69        private Map<ResourceUnitName, ResourceUnit> chooseResourcesForExecution(ClusterResourceManager resourceManager, TaskInterface<?> task) {
70
71                List<ComputingNode> nodes = resourceManager.getComputingNodes();
72                nodes = findSuitableNodes(task, nodes);
73                Collections.sort(nodes, new Comparator<ComputingNode>(){
74                    public int compare(ComputingNode node1, ComputingNode node2){   
75                        return node1.getResourceCharacteristic().getParameters().get("category").get(0).getContent().compareTo(node2.getResourceCharacteristic().getParameters().get("category").get(0).getContent());
76                    }
77                });
78                if(nodes.size() > 0)
79                {
80                        Map<ResourceUnitName, ResourceUnit> map = new HashMap<ResourceUnitName, ResourceUnit>();
81                        List<ComputingResource> choosenResources =  new ArrayList<ComputingResource>();
82                        int cpuRequest;
83                        try {
84                                cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
85                        } catch (NoSuchFieldException e) {
86                                cpuRequest = 1;
87                        }
88                        for (int i = 0; i < nodes.get(0).getProcessors().size() && cpuRequest > 0; i++) {
89                                if (nodes.get(0).getProcessors().get(i).getStatus() == ResourceStatus.FREE) {
90                                        choosenResources.add(nodes.get(0).getProcessors().get(i));
91                                        cpuRequest--;
92                                }
93                        }
94                        ProcessingElements result = new ProcessingElements(nodes.get(0).getName());
95                        result.addAll(choosenResources);
96                        map.put(StandardResourceUnitName.PE, result);
97                        return map;
98                } else
99                        return null;
100        }
101       
102        private List<ComputingNode> findSuitableNodes(TaskInterface<?> task, List<ComputingNode> nodes){
103                int cpuRequest;
104                try {
105                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
106                } catch (NoSuchFieldException e) {
107                        cpuRequest = 1;
108                }
109                List<ComputingNode> avNodes = new ArrayList<ComputingNode>();
110                for(ComputingNode node: nodes){
111                        if(node.getFreeProcessorsNumber() >= cpuRequest){
112                                avNodes.add(node);
113                        }
114                }
115                return avNodes;
116        }
117
118        private void turnOffIdleNodes(List<ComputingNode> nodes){
119                for(ComputingNode node : nodes){
120                        if(node.getFreeProcessorsNumber() == node.getProcessorsNumber()){
121                                node.getPowerInterface().setPowerState(StandardPowerStateName.OFF);
122                        }
123                }
124        }
125       
126        private boolean harnessIdleNodesToWork(TaskInterface<?> task, List<ComputingNode> nodes){
127                int cpuRequest;
128                try {
129                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
130                } catch (NoSuchFieldException e) {
131                        cpuRequest = 1;
132                }
133                Collections.sort(nodes, new Comparator<ComputingNode>(){
134                    public int compare(ComputingNode node1, ComputingNode node2){   
135                        return node1.getResourceCharacteristic().getParameters().get("category").get(0).getContent().compareTo(node2.getResourceCharacteristic().getParameters().get("category").get(0).getContent());
136                    }
137                });
138                for (int i = 0; i < nodes.size() && cpuRequest > 0; i++) {
139                        ComputingNode node = nodes.get(i);
140                        if(node.getPowerInterface().getPowerState() == StandardPowerStateName.OFF){
141                                node.getPowerInterface().setPowerState(StandardPowerStateName.ON);
142                                cpuRequest -= node.getProcessorsNumber();
143                        }
144                }
145                return cpuRequest > 0 ? false : true;
146        }
147
148}
Note: See TracBrowser for help on using the repository browser.