source: DCWoRMS/trunk/src/example/localplugin/FCFSBF_NodePowerManagementClusterPlugin.java @ 525

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