/*********************************************************************************************************************** * * Copyright (C) 2010 by the Stratosphere project (http://stratosphere.eu) * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. * **********************************************************************************************************************/ package eu.stratosphere.nephele.visualization.swt; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import eu.stratosphere.nephele.jobgraph.JobID; import eu.stratosphere.nephele.managementgraph.ManagementGraph; import eu.stratosphere.nephele.managementgraph.ManagementGroupEdge; import eu.stratosphere.nephele.managementgraph.ManagementGroupVertex; import eu.stratosphere.nephele.topology.NetworkTopology; public class GraphVisualizationData { private final JobID jobID; private final String jobName; private final ManagementGraph managementGraph; private final NetworkTopology networkTopology; private final boolean profilingEnabledForJob; private final long submissionTimestamp; public GraphVisualizationData(JobID jobID, String jobName, boolean profilingEnabledForJob, long submissionTimestamp, ManagementGraph managementGraph, NetworkTopology networkTopology) { this.jobID = jobID; this.jobName = jobName; this.profilingEnabledForJob = profilingEnabledForJob; this.submissionTimestamp = submissionTimestamp; this.managementGraph = managementGraph; this.networkTopology = networkTopology; } public String getJobName() { return this.jobName; } public JobID getJobID() { return this.jobID; } public ManagementGraph getManagementGraph() { return this.managementGraph; } public NetworkTopology getNetworkTopology() { return this.networkTopology; } public boolean isProfilingAvailableForJob() { return this.profilingEnabledForJob; } public long getSubmissionTimestamp() { return this.submissionTimestamp; } public void detectBottlenecks() { // Detect CPU bottlenecks final List<ManagementGroupVertex> reverseTopologicalSort = this.managementGraph .getGroupVerticesInReverseTopologicalOrder(); final Map<ManagementGroupVertex, Boolean> successorCPUBottleneckMap = new HashMap<ManagementGroupVertex, Boolean>(); Iterator<ManagementGroupVertex> it = reverseTopologicalSort.iterator(); boolean atLeastOneCPUBottleneck = false; while (it.hasNext()) { final ManagementGroupVertex groupVertex = it.next(); final GroupVertexVisualizationData groupVertexVisualizationData = (GroupVertexVisualizationData) groupVertex .getAttachment(); groupVertexVisualizationData.updateCPUBottleneckFlag(successorCPUBottleneckMap); if (groupVertexVisualizationData.isCPUBottleneck()) { atLeastOneCPUBottleneck = true; } } // If there is a CPU bottleneck do not look for further I/O bottlenecks if (atLeastOneCPUBottleneck) { return; } // Detect IO bottlenecks it = reverseTopologicalSort.iterator(); final Map<ManagementGroupEdge, Boolean> successorIOBottleneckMap = new HashMap<ManagementGroupEdge, Boolean>(); while (it.hasNext()) { final ManagementGroupVertex groupVertex = it.next(); for (int i = 0; i < groupVertex.getNumberOfForwardEdges(); i++) { final ManagementGroupEdge groupEdge = groupVertex.getForwardEdge(i); final GroupEdgeVisualizationData groupEdgeVisualizationData = (GroupEdgeVisualizationData) groupEdge .getAttachment(); groupEdgeVisualizationData.updateIOBottleneckFlag(successorIOBottleneckMap); } } } }