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

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