source: xssim/branches/tpiontek/example/tomekp/nodestest/FCFSNodePowerManagementClusterLocalPlugin.java @ 275

Revision 275, 6.2 KB checked in by wojtekp, 13 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package tomekp.nodestest;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.HashMap;
7import java.util.List;
8import java.util.Map;
9import java.util.Properties;
10
11import schedframe.resources.PowerState;
12import schedframe.resources.units.ResourceUnit;
13import schedframe.scheduling.TaskInterface;
14import schedframe.scheduling.events.SchedulingEvent;
15import schedframe.scheduling.plugin.grid.ModuleList;
16import schedframe.scheduling.utils.ResourceParameterName;
17import test.rewolucja.GSSIMJobInterface;
18import test.rewolucja.resources.ProcessingElements;
19import test.rewolucja.resources.ResourceStatus;
20import test.rewolucja.resources.manager.implementation.ClusterResourceManager;
21import test.rewolucja.resources.manager.interfaces.ResourceManagerInterface;
22import test.rewolucja.resources.physical.base.ComputingResource;
23import test.rewolucja.resources.physical.implementation.ComputingNode;
24import test.rewolucja.scheduling.JobRegistryInterface;
25import test.rewolucja.scheduling.plan.SchedulingPlanInterfaceNew;
26import test.rewolucja.scheduling.plan.SchedulingPlanNew;
27import test.rewolucja.scheduling.queue.Queue;
28import test.rewolucja.scheduling.queue.QueueList;
29import example.localplugin.BaseLocalPlugin;
30import gridsim.Gridlet;
31
32public class FCFSNodePowerManagementClusterLocalPlugin extends BaseLocalPlugin {
33
34        public FCFSNodePowerManagementClusterLocalPlugin () {
35        }
36
37        public SchedulingPlanInterfaceNew schedule(SchedulingEvent event, QueueList queues, JobRegistryInterface jobRegistry,
38                        ResourceManagerInterface resManager, ModuleList modules) {
39
40                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
41                SchedulingPlanNew plan = new SchedulingPlanNew();
42                // chose the events types to serve.
43                // Different actions for different events are possible.
44                switch (event.getType()) {
45                case START_TASK_EXECUTION:
46                case TASK_FINISHED:
47                case POWER_STATE_CHANGED:
48                        // our tasks are placed only in first queue (see
49                        // BaseLocalPlugin.placeJobsInQueues() method)
50                        Queue q = queues.get(0);
51                        // check all tasks in queue
52                        boolean harnesStataus = false;
53                        for (int i = 0; i < q.size(); i++) {
54                                GSSIMJobInterface<?> job = q.get(i);
55                                TaskInterface<?> task = (TaskInterface<?>) job;
56                                // if status of the tasks in READY
57                                if (task.getStatus() == Gridlet.READY) {
58
59                                        Map<ResourceParameterName, ResourceUnit> choosenResources = chooseResourcesForExecution(resourceManager, task);
60                                        if (choosenResources  != null) {
61                                                ProcessingElements pes = (ProcessingElements)choosenResources.get(ResourceParameterName.PROCESSINGELEMENTS);
62                                                System.out.println(task.getJobId()+" on :"+pes.get(0).getName());
63                                                addToSchedulingPlan(plan, task, choosenResources);
64                                        } else if(harnesStataus) {
65                                                harnesStataus = false;
66                                        }
67                                        else {
68                                                if(harnessIdleNodesToWork(task, resourceManager.getComputingNodes())){
69                                                        harnesStataus = true;
70                                                        i--;
71                                                }
72                                               
73                                        }
74                                }
75                        }
76
77                        turnOffIdleNodes(resourceManager.getComputingNodes());
78
79                        break;
80                }
81                return plan;
82        }
83       
84        private HashMap<ResourceParameterName, ResourceUnit> chooseResourcesForExecution(ClusterResourceManager resourceManager, TaskInterface<?> task) {
85
86                List<ComputingNode> nodes = resourceManager.getComputingNodes();
87                nodes = findSuitableNodes(task, nodes);
88                Collections.sort(nodes, new Comparator<ComputingNode>(){
89                    public int compare(ComputingNode node1, ComputingNode node2){   
90                        return node1.getCategory().getName().compareTo(node2.getCategory().getName());
91                    }
92                });
93                if(nodes.size() > 0)
94                {
95                        HashMap<ResourceParameterName, ResourceUnit> map = new HashMap<ResourceParameterName, ResourceUnit>();
96                        List<ComputingResource> choosenResources =  new ArrayList<ComputingResource>();
97                        int cpuRequest;
98                        try {
99                                cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
100                        } catch (NoSuchFieldException e) {
101                                cpuRequest = 1;
102                        }
103                        for (int i = 0; i < nodes.get(0).getProcessors().size() && cpuRequest > 0; i++) {
104                                if (nodes.get(0).getProcessors().get(i).getStatus() == ResourceStatus.FREE ) {
105                                        choosenResources.add(nodes.get(0).getProcessors().get(i));
106                                        cpuRequest--;
107                                }
108                        }
109                        ProcessingElements result = new ProcessingElements(nodes.get(0).getName());
110                        result.addAll(choosenResources);
111                        map.put(ResourceParameterName.PROCESSINGELEMENTS, result);
112                        return map;
113                } else
114                        return null;
115        }
116       
117        private List<ComputingNode> findSuitableNodes(TaskInterface<?> task, List<ComputingNode> nodes){
118                int cpuRequest;
119                try {
120                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
121                } catch (NoSuchFieldException e) {
122                        cpuRequest = 1;
123                }
124                List<ComputingNode> avNodes = new ArrayList<ComputingNode>();
125                for(ComputingNode node: nodes){
126                        if(node.getFreeProcessorsNumber() >= cpuRequest && node.getPowerInterface().getPowerState()==PowerState.ON){
127                                avNodes.add(node);
128                        }
129                }
130                return avNodes;
131        }
132
133        private void turnOffIdleNodes(List<ComputingNode> nodes){
134                for(ComputingNode node : nodes){
135                        if(node.getFreeProcessorsNumber() == node.getProcessorsNumber() && node.getPowerInterface().getPowerState()==PowerState.ON){
136                                System.out.println("wylaczam"+node.getName());
137                                node.getPowerInterface().setPowerState(PowerState.OFF);
138                        }
139                }
140        }
141       
142        private boolean harnessIdleNodesToWork(TaskInterface<?> task, List<ComputingNode> nodes){
143                int cpuRequest;
144                try {
145                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
146                } catch (NoSuchFieldException e) {
147                        cpuRequest = 1;
148                }
149                Collections.sort(nodes, new Comparator<ComputingNode>(){
150                    public int compare(ComputingNode node1, ComputingNode node2){   
151                        return node1.getCategory().getName().compareTo(node2.getCategory().getName());
152                    }
153                });
154                for (int i = 0; i < nodes.size() && cpuRequest > 0; i++) {
155                        ComputingNode node = nodes.get(i);
156                        if(node.getPowerInterface().getPowerState() == PowerState.OFF){
157                                System.out.println("wlaczam"+node.getName());
158                                node.getPowerInterface().setPowerState(PowerState.ON);
159                                cpuRequest -= node.getProcessorsNumber();
160                        }
161                }
162                return cpuRequest > 0 ? false : true;
163        }
164       
165        public String getName() {
166                return getClass().getName();
167        }
168
169        public void init(Properties properties) {
170                // no extra initialization is expected.
171        }
172
173}
Note: See TracBrowser for help on using the repository browser.