source: xssim/branches/tpiontek/src/example/localplugin/FCFSPreferedRandomClusterLocalPlugin.java @ 269

Revision 269, 7.5 KB checked in by piontek, 13 years ago (diff)
Line 
1package example.localplugin;
2
3import gridsim.Gridlet;
4import gridsim.gssim.ResourceHistoryItem;
5import gridsim.gssim.SubmittedTask;
6
7import java.util.ArrayList;
8import java.util.List;
9import java.util.Properties;
10import java.util.Random;
11
12import schedframe.resources.PowerState;
13import schedframe.scheduling.TaskInterface;
14import schedframe.scheduling.events.SchedulingEvent;
15import schedframe.scheduling.events.TaskFinishedEvent;
16import schedframe.scheduling.plugin.grid.ModuleList;
17import schedframe.scheduling.utils.ResourceParameterName;
18import test.rewolucja.GSSIMJobInterface;
19import test.rewolucja.energy.profile.PStateType;
20import test.rewolucja.resources.ProcessingElements;
21import test.rewolucja.resources.ResourceStatus;
22import test.rewolucja.resources.ResourceType;
23import test.rewolucja.resources.manager.implementation.ClusterResourceManager;
24import test.rewolucja.resources.manager.interfaces.ResourceManagerInterface;
25import test.rewolucja.resources.physical.base.ComputingResource;
26import test.rewolucja.resources.physical.implementation.ComputingNode;
27import test.rewolucja.resources.physical.implementation.Processor;
28import test.rewolucja.scheduling.JobRegistryInterface;
29import test.rewolucja.scheduling.UsedResourceList;
30import test.rewolucja.scheduling.plan.SchedulingPlanInterfaceNew;
31import test.rewolucja.scheduling.plan.SchedulingPlanNew;
32import test.rewolucja.scheduling.queue.Queue;
33import test.rewolucja.scheduling.queue.QueueList;
34
35public class FCFSPreferedRandomClusterLocalPlugin extends BaseLocalPlugin {
36
37        private Random rand;
38        private boolean init = true;
39       
40        int scenario = 3;
41        String prefered = null;
42       
43        public FCFSPreferedRandomClusterLocalPlugin() {
44                rand = new Random(5);
45        }
46
47        public SchedulingPlanInterfaceNew schedule(SchedulingEvent event, QueueList queues, JobRegistryInterface jobRegistry,
48                         ResourceManagerInterface resManager, ModuleList modules) {
49               
50                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
51               
52                if( init)
53                {
54                        List<Processor> cpus = resourceManager.getProcessors();
55                       
56                        for( Processor cpu : cpus)
57                                cpu.getPowerInterface().setPState( PStateType.P0);
58                       
59                        init = false;
60                }
61               
62
63               
64                SchedulingPlanNew plan = new SchedulingPlanNew();
65                // chose the events types to serve.
66                // Different actions for different events are possible.
67                switch (event.getType()) {
68                case TASK_FINISHED:
69                        if( scenario == 2)
70                        {       
71                                TaskFinishedEvent finEvent = (TaskFinishedEvent) event;
72                                SubmittedTask subTask = jobRegistry.getSubmittedTask(finEvent.getJobId(), finEvent.getTaskId());
73                                UsedResourceList<ResourceHistoryItem> usedResourcesList = subTask.getUsedResources();
74                                ProcessingElements pes = (ProcessingElements)usedResourcesList.getLast().getResourceUnits().get(ResourceParameterName.PROCESSINGELEMENTS);
75                               
76                                for( ComputingResource cr : pes)
77                                {
78                                        ((Processor)cr).getPowerInterface().setPowerState( PowerState.OFF);
79                                }
80                        }
81                       
82                case START_TASK_EXECUTION:
83                        // our tasks are placed only in first queue (see
84                        // BaseLocalPlugin.placeJobsInQueues() method)
85                        Queue q = queues.get(0);
86                        // check all tasks in queue
87
88                        for (int i = 0; i < q.size(); i++) {
89                                GSSIMJobInterface<?> job = q.get(i);
90                                TaskInterface<?> task = (TaskInterface<?>) job;
91                                // if status of the tasks in READY
92                                if (task.getStatus() == Gridlet.READY) {
93                                       
94                                        ComputingNode node = chooseRandomProvider(resourceManager, ResourceStatus.FREE, task);
95                                       
96                                        if (node != null) {
97                                                List<Processor> cpus = chooseProcessorsForExecution(node, ResourceStatus.FREE, task);
98                                               
99                                                int type = Integer.parseInt( task.getJobId()) % 4;
100                                                String model = cpus.get(0).getComputingNode().getCategory().getName();
101                                                //System.out.println(type + " -> " + model);
102                                               
103                                                addToSchedulingPlan(plan, task, cpus);
104                                        }
105                                        else
106                                        {
107                                                switch( scenario)
108                                                {
109                                                case 0: break;
110                                                case 1: break;
111                                                case 2:
112                                                        node = chooseRandomProvider(resourceManager, ResourceStatus.UNAVAILABLE, task);
113                                                        if( node != null)
114                                                        {       
115                                                                List<Processor> cpus = chooseProcessorsForExecution(node, ResourceStatus.UNAVAILABLE, task);
116                                                                for( Processor cpu: cpus)
117                                                                        cpu.getPowerInterface().setPowerState( PowerState.ON);
118                                                               
119                                                                i--;
120                                                        }
121                                                        break;
122                                                }
123                                        }
124                                }
125                        }
126                       
127                        switch( scenario)
128                        {
129                                case 0: break;
130                                case 1: 
131                               
132                                        for( Processor cpu : resourceManager.getProcessors())
133                                        {
134                                                switch( cpu.getStatus())
135                                                {
136                                                        case FREE: cpu.getPowerInterface().setPState( PStateType.P3); break;
137                                                        case PENDING: cpu.getPowerInterface().setPState( PStateType.P0); break;
138                                                }
139                                               
140                                        }
141                                        break;
142                               
143                                case 2:
144                                        for( Processor cpu : resourceManager.getProcessors())
145                                        {
146                                                switch( cpu.getStatus())
147                                                {
148                                                        case FREE: cpu.getPowerInterface().setPowerState( PowerState.OFF); break;
149                                                }       
150                                        }
151                                        break;
152                               
153                                default: break;
154                        }
155                       
156                        break;
157                }
158                return plan;
159        }
160
161        private List<ComputingNode> findSuitableNodes(String model, int cpuRequest, ResourceStatus status, List<ComputingNode> nodes){
162                List<ComputingNode> avNodes = new ArrayList<ComputingNode>();
163                for(ComputingNode node: nodes)
164                {
165                        if( (model == null || node.getCategory().getName().equals(model)))
166                        {       
167                                @SuppressWarnings("unchecked")
168                                List<Processor> cpus = (List<Processor>)node.getDescendantsByTypeAndStatus( ResourceType.CPU, status);
169                               
170                                if( cpus.size() >= cpuRequest)
171                                        avNodes.add(node);
172                        }
173                }
174                return avNodes;
175        }
176       
177        private int getCpuRequest( TaskInterface<?> task)
178        {
179                int cpuRequest;
180               
181                try {
182                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
183                } catch (NoSuchFieldException e) {
184                        cpuRequest = 1;
185                }
186               
187                return cpuRequest;
188        }
189       
190        private ComputingNode chooseRandomProvider(ClusterResourceManager resourceManager, ResourceStatus status, TaskInterface<?> task) {
191               
192                String preferedNode = null;
193               
194                int cpuRequest = getCpuRequest(task);
195               
196                List<ComputingNode> nodes = null;
197               
198                switch( scenario)
199                {
200                        case 3:
201                                int type = Integer.parseInt( task.getJobId()) % 4;
202                                switch( type)
203                                {
204                                        case 0: preferedNode = "B"; break;
205                                        default: preferedNode = "A"; break;
206                                }
207                                break;
208                        default:
209                                preferedNode = prefered;
210                                break;
211                               
212                }
213               
214                nodes = findSuitableNodes(preferedNode, cpuRequest, status, resourceManager.getComputingNodes());
215                switch( nodes.size())
216                {
217                        case 0: break;
218                        case 1: return nodes.get(0);
219                        default:
220                                int nodeIdx = rand.nextInt(nodes.size());
221                                ComputingNode node = nodes.get(nodeIdx);               
222                                return node;
223                }
224               
225               
226                if( preferedNode != null)
227                {       
228                        nodes = findSuitableNodes( getUnprefered(preferedNode), cpuRequest, status, resourceManager.getComputingNodes());
229                        switch( nodes.size())
230                        {
231                                case 0: break;
232                                case 1: return nodes.get(0);
233                                default: 
234                                        int nodeIdx = rand.nextInt(nodes.size());
235                                        ComputingNode node = nodes.get(nodeIdx);               
236                                        return node;
237                        }
238                }
239                       
240                return null;
241        }
242       
243        public String getName() {
244                return getClass().getName();
245        }
246
247        public void init(Properties properties) {
248                // no extra initialization is expected.
249        }
250       
251        private List<Processor> chooseProcessorsForExecution( 
252                        ComputingNode node, ResourceStatus status, TaskInterface<?> task) {
253               
254                int cpuRequest = getCpuRequest(task);
255
256                List<Processor> cpus = (List<Processor>)node.getDescendantsByTypeAndStatus( ResourceType.CPU, status);
257               
258                return cpus.subList(0, cpuRequest);
259        }
260       
261        private String getUnprefered( String preferedNode)
262        {
263                if( preferedNode.equals("A"))
264                        return "B";
265               
266                if( preferedNode.equals("B"))
267                        return "A";
268               
269                return null;
270        }
271
272}
273
Note: See TracBrowser for help on using the repository browser.