source: DCWoRMS/trunk/build/classes/schedframe/scheduling/manager/resources/LocalResourceManager.java @ 477

Revision 477, 12.6 KB checked in by wojtekp, 13 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package schedframe.scheduling.manager.resources;
2
3import gridsim.GridSim;
4
5import java.util.ArrayDeque;
6import java.util.ArrayList;
7import java.util.Deque;
8import java.util.HashMap;
9import java.util.HashSet;
10import java.util.Iterator;
11import java.util.List;
12import java.util.Map;
13import java.util.Properties;
14import java.util.Set;
15import java.util.Stack;
16
17import schedframe.exceptions.ResourceException;
18import schedframe.resources.ResourceStatus;
19import schedframe.resources.ResourceType;
20import schedframe.resources.StandardResourceType;
21import schedframe.resources.computing.ComputingResource;
22import schedframe.resources.computing.ResourceCharacteristics;
23import schedframe.resources.computing.validator.ResourcePropertiesValidator;
24import schedframe.resources.computing.validator.ResourceValidator;
25import schedframe.resources.units.PEUnit;
26import schedframe.resources.units.ProcessingElements;
27import schedframe.resources.units.ResourceUnit;
28import schedframe.resources.units.ResourceUnitName;
29import schedframe.resources.units.ResourceUnitState;
30import schedframe.resources.units.StandardResourceUnitName;
31import schedframe.scheduling.Scheduler;
32import schedframe.scheduling.plugin.local.ResourceAllocationInterface;
33
34
35public class LocalResourceManager implements ResourceAllocationInterface, ResourceManager {
36
37        //private Log log = LogFactory.getLog(ResourceManager.class);
38
39        protected List<ComputingResource> computingResources;
40        protected List<Scheduler> schedulers;
41        //protected ResourceCharacteristics resourceCharacteristic;
42        protected Map<ResourceUnitName, List<ResourceUnit>> resourceUnits;
43
44        public LocalResourceManager(List<ComputingResource> resources, List<Scheduler> schedulers, Map<ResourceUnitName, List<ResourceUnit>> resourceUnits) {
45                this.computingResources = resources;
46                this.schedulers = schedulers;
47                this.resourceUnits = resourceUnits;
48
49                //initSharedResourceUnits(computingResources);
50        }
51
52        public LocalResourceManager(ComputingResource compResource) {
53                this.computingResources = compResource.getChildren();
54
55                initSharedResourceUnits(compResource);
56        }
57
58        public void initSharedResourceUnits(ComputingResource compResource){
59                this.resourceUnits = new HashMap<ResourceUnitName, List<ResourceUnit>>();
60                List<ResourceUnit> list;
61
62                ComputingResource parent = compResource.getParent();
63                while(parent != null){
64                        Map<ResourceUnitName, List<ResourceUnit>> resUnits = parent.getResourceCharacteristic().getResourceUnits();
65                        for(ResourceUnitName run : resUnits.keySet()){
66                                for(ResourceUnit resUnit : resUnits.get(run)){
67                                        if((resourceUnits.get(run) == null)){
68                                                list = new ArrayList<ResourceUnit>(1);
69                                                resourceUnits.put(resUnit.getName(), list);
70                                                list.add(resUnit);
71                                        } else if(!resourceUnits.get(run).contains(resUnit)){
72                                                list = resourceUnits.get(resUnit.getName());
73                                                list.add(resUnit);
74                                        }
75                                }
76                        }
77                        parent = parent.getParent();
78                }
79        }
80       
81        public List<ComputingResource> getResources() {
82                return computingResources;
83        }
84
85        public boolean areResourcesAchievable(ResourceType type) {
86                if (computingResources != null) {
87                        Deque<ComputingResource> toExamine = new ArrayDeque<ComputingResource>();
88                        for (ComputingResource resource : computingResources){
89                                toExamine.push(resource);       
90                        }
91                       
92                        while (!toExamine.isEmpty()) {
93                                ComputingResource resource = toExamine.pop();
94                                if(resource.getType() == type)
95                                        return true;
96                                List<ComputingResource> resources = resource.getChildren();
97                                /*if (resources == null)
98                                        continue;*/
99                                int numberOfResComp = resources.size();
100                                for (int i = 0; i < numberOfResComp; i++) {
101                                        ComputingResource resourceChild = resources.get(i);
102                                        if (resourceChild.getType() == type) {
103                                                return true;
104                                        } else
105                                                toExamine.push(resourceChild);
106                                }
107                        }
108                }
109                return false;
110        }
111
112        public List<? extends ComputingResource> getResourcesOfType(ResourceType type) throws ResourceException {
113                List<ComputingResource> resourcesOfType = new ArrayList<ComputingResource>();
114                for (ComputingResource resource : computingResources) {
115                        if (resource.getType() == type) {
116                                resourcesOfType.add(resource);
117                        } else
118                                resourcesOfType.addAll(resource.getDescendantsByType(type));
119                }
120                return resourcesOfType;
121        }
122
123        public List<? extends ComputingResource> getResourcesByTypeWithStatus(ResourceType type, ResourceStatus status)
124                        throws ResourceException {
125
126                List<ComputingResource> resourcesOfType = new ArrayList<ComputingResource>();
127                for (ComputingResource resource : computingResources) {
128                        if (resource.getType() == type) {
129                                if (resource.getStatus() == status) {
130                                        resourcesOfType.add(resource);
131                                }
132                        } else
133                                resourcesOfType.addAll(resource.getDescendantsByTypeAndStatus(type, status));
134                }
135                return resourcesOfType;
136        }
137
138        public ComputingResource getResourceByName(String resourceName) throws ResourceException {
139                ComputingResource resourceWithName = null;
140                for (int i = 0; i < computingResources.size() && resourceWithName == null; i++) {
141                        ComputingResource resource = computingResources.get(i);
142                        if (resource.getName().equals(resourceName))
143                                resourceWithName = resource;
144                        else
145                                resourceWithName = resource.getDescendantByName(resourceName);
146                }
147                return resourceWithName;
148        }
149
150        public List<ResourceUnit> getDistributedResourceUnits(ResourceUnitName unitName)  {
151                List<ResourceUnit> resourceUnit = new ArrayList<ResourceUnit>();
152                if (computingResources != null) {
153                        Deque<ComputingResource> toExamine = new ArrayDeque<ComputingResource>();
154                        for (ComputingResource resource : computingResources)
155                                toExamine.push(resource);
156                        while (!toExamine.isEmpty()) {
157                                ComputingResource resource = toExamine.pop();
158                                ResourceCharacteristics resourceCharacteristic = resource.getResourceCharacteristic();
159                                List<ResourceUnit> units = null;
160                                units = resourceCharacteristic.getResourceUnits().get(unitName);
161                                if (units != null)
162                                        resourceUnit.addAll(units);
163                                // else {
164                                List<ComputingResource> resources = resource.getChildren();
165                                /*if (resources == null)
166                                        continue;*/
167                                int numberOfResComp = resources.size();
168                                for (int i = 0; i < numberOfResComp; i++) {
169                                        ComputingResource resourceChild = resources.get(i);
170                                        toExamine.push(resourceChild);
171                                }
172                                // }
173                        }
174                }
175                return resourceUnit;
176        }
177        /*public List<AbstractResourceUnit> getAvailableResourceUnits(String resourceName) throws Exception {
178                ComputingResource resource = getResourceByName(resourceName);
179                List<AbstractResourceUnit> resourceUnits = new ArrayList<AbstractResourceUnit>();
180                while(resource != null){
181                        for(List<AbstractResourceUnit> resUnits: resource.getResourceCharacteristic().getResourceUnits().values())
182                                resUnits.addAll(resourceUnits);
183                        resource = resource.getParent();
184                }
185               
186                return resourceUnits;
187        }*/
188
189        public List<? extends ComputingResource> filterResources(Properties properties) {
190                List<ComputingResource> descendants = new ArrayList<ComputingResource>();
191                for (ComputingResource resource : computingResources) {
192                        ResourceValidator resourceValidator =  new ResourcePropertiesValidator(properties);
193                        if (resourceValidator.validate(resource))
194                                descendants.add(resource);
195                        else
196                                descendants.addAll(resource.filterDescendants(properties));
197                }
198                return descendants;
199        }
200
201        public Map<ResourceUnitName, List<ResourceUnit>> getSharedResourceUnits() {
202               
203                /*Map<ResourceUnitName, List<ResourceUnit>> sharedResourceUnits = new HashMap<ResourceUnitName, List<ResourceUnit>>();
204                List<ResourceUnit> list;
205                for(ComputingResource resource : compResources){
206                        boolean resourceNotVisited = true;
207                        ComputingResource parent = resource.getParent();
208                        while(parent != null && resourceNotVisited){
209                                Map<ResourceUnitName, List<ResourceUnit>> resUnits = parent.getResourceCharacteristic().getResourceUnits();
210                                for(ResourceUnitName run : resUnits.keySet()){
211                                        for(ResourceUnit resUnit : resUnits.get(run)){
212                                                if((sharedResourceUnits.get(run) == null)){
213                                                        list = new ArrayList<ResourceUnit>(1);
214                                                        sharedResourceUnits.put(resUnit.getName(), list);
215                                                        list.add(resUnit);
216                                                } else if(!sharedResourceUnits.get(run).contains(resUnit)){
217                                                        list = sharedResourceUnits.get(resUnit.getName());
218                                                        list.add(resUnit);
219                                                } else {
220                                                        resourceNotVisited = false;
221                                                }
222                                        }
223                                }
224                                parent = parent.getParent();
225                        }
226                }
227                return sharedResourceUnits;*/
228                return resourceUnits;
229        }
230               
231        public List<Scheduler> getSchedulers() {
232                return schedulers;
233        }
234       
235        @SuppressWarnings("unchecked")
236        public List<ResourceUnit> getPE() throws ResourceException{
237               
238                List<ResourceUnit> peUnits = null;
239                List<ComputingResource> computingResources = null;
240                if(areResourcesAchievable(StandardResourceType.Core)){
241                        try {
242                                computingResources = (List<ComputingResource>) getResourcesOfType(StandardResourceType.Core);
243                        } catch (ResourceException e) {
244                                throw new RuntimeException("GSSIM internal error");
245                        }
246                        PEUnit peUnit = new ProcessingElements(computingResources);
247                        peUnits = new ArrayList<ResourceUnit>();
248                        peUnits.add(peUnit);                   
249                }
250
251                else if(areResourcesAchievable(StandardResourceType.Processor)){
252                        try {
253                                computingResources = (List<ComputingResource>) getResourcesOfType(StandardResourceType.Processor);
254                        } catch (ResourceException e) {
255                                throw new RuntimeException("GSSIM internal error");
256                        }
257                        PEUnit peUnit = new ProcessingElements(computingResources);
258                        peUnits = new ArrayList<ResourceUnit>();
259                        peUnits.add(peUnit);                   
260                }
261
262                else if (getDistributedResourceUnits(StandardResourceUnitName.PE).size() > 0){
263                        peUnits = getDistributedResourceUnits(StandardResourceUnitName.PE);
264                }
265               
266                else if(getSharedResourceUnits().get(StandardResourceUnitName.PE) != null){
267                                peUnits = getSharedResourceUnits().get(StandardResourceUnitName.PE);
268                }
269                if(peUnits == null)
270                        throw new ResourceException("Processing Elements are not defined");
271                return peUnits;
272        }
273       
274        public String getSchedulerName(String resName){
275                if(GridSim.getEntityId(resName) != -1){
276                        return resName;
277                }
278                ComputingResource resourceWithName = null;
279                for(int i = 0 ; i < computingResources.size() && resourceWithName == null; i++){
280                        ComputingResource resource = computingResources.get(i);
281                        if(resource.getName().equals(resName))
282                                resourceWithName = resource;
283                        else
284                                try {
285                                        resourceWithName = resource.getDescendantByName(resName);
286                                } catch (ResourceException e) {
287                                        return null;
288                                }
289                }
290                if(resourceWithName == null)
291                        return null;
292                List<ComputingResource> children = resourceWithName.getChildren();
293                Set<Scheduler> childrenSchedulers = new HashSet<Scheduler>();
294                if(children.isEmpty())
295                        return null;
296                for(ComputingResource child: children) {
297                        childrenSchedulers.add(child.getScheduler());
298                }       
299
300                Set<Scheduler> tempChildrenSchedulers = new HashSet<Scheduler>(childrenSchedulers);
301                while(childrenSchedulers.size() > 1){
302                        childrenSchedulers = new HashSet<Scheduler>();
303                        for(Scheduler s: tempChildrenSchedulers){
304                                childrenSchedulers.add(s.getParent());
305                        }
306                        tempChildrenSchedulers = new HashSet<Scheduler>(childrenSchedulers);
307                }
308                Iterator<Scheduler> it = childrenSchedulers.iterator();
309                Scheduler potentialScheduler = it.next();
310                if(potentialScheduler.getCompResources().containsAll(children))
311                        return potentialScheduler.get_name();
312                return null;
313        }
314       
315        public boolean allocateResources(Map<ResourceUnitName, ResourceUnit> resources) {
316               
317                if (resources == null) {
318                        return false;
319                }
320                /*ResourceUnit peUnit = resources.get(StandardResourceUnitName.PE);
321
322                if (peUnit != null) {
323                        if (peUnit instanceof ProcessingElements) {
324                                ProcessingElements choosenProcessors = (ProcessingElements) peUnit;
325
326                                for (int i = 0; i < choosenProcessors.size(); i++) {
327                                        choosenProcessors.get(i).setStatus(ResourceStatus.BUSY);
328                                }
329                        }
330                }*/
331
332                /*Memory m = (Memory) resources.get(StandardResourceUnitName.MEMORY);
333                if (m != null) {
334                        m.getProvisioner().setState(ResourceUnitState.BUSY);
335                }*/
336               
337                for(ResourceUnitName resUnitName: resources.keySet()){
338                        ResourceUnit resUnit = resources.get(resUnitName);
339                        resUnit.getProvisioner().setState(ResourceUnitState.BUSY);
340                }
341                return true;
342        }
343
344
345        public void freeResources(Map<ResourceUnitName, ResourceUnit> resources) {
346               
347                /*ResourceUnit peUnit = resources.get(StandardResourceUnitName.PE);
348               
349                if (peUnit instanceof ProcessingElements) {
350                        ProcessingElements processingElements = (ProcessingElements) peUnit;
351
352                        for (int i = 0; i < processingElements.size(); i++) {
353                                processingElements.get(i).setStatus(ResourceStatus.FREE);
354                        }
355                }*/
356
357                /*Memory m = (Memory) resources.get(StandardResourceUnitName.MEMORY);
358                if (m != null) {
359                        m.getProvisioner().setState(ResourceUnitState.FREE);
360                }*/
361               
362                for(ResourceUnitName resUnitName: resources.keySet()){
363                        ResourceUnit resUnit = resources.get(resUnitName);
364                        resUnit.getProvisioner().setState(ResourceUnitState.FREE);
365                }
366        }
367
368
369}
Note: See TracBrowser for help on using the repository browser.