eu.stratosphere.nephele.managementgraph.ManagementVertex Maven / Gradle / Ivy
/***********************************************************************************************************************
* Copyright (C) 2010-2013 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.managementgraph;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import eu.stratosphere.core.io.IOReadableWritable;
import eu.stratosphere.core.io.StringRecord;
import eu.stratosphere.nephele.execution.ExecutionState;
import eu.stratosphere.nephele.util.EnumUtils;
import eu.stratosphere.util.StringUtils;
/**
* This class implements a management vertex of a {@link ManagementGraph}. A management vertex is derived from the type
* of vertices Nephele uses in its internal scheduling structures.
*
* This class is not thread-safe.
*
*/
public final class ManagementVertex extends ManagementAttachment implements IOReadableWritable {
/**
* The management group vertex this vertex belongs to.
*/
private final ManagementGroupVertex groupVertex;
/**
* The ID of this management group vertex.
*/
private final ManagementVertexID id;
/**
* A list of input gates which belong to this vertex.
*/
private final List inputGates = new ArrayList();
/**
* A list of output gates which belong to this vertex.
*/
private final List outputGates = new ArrayList();
/**
* The current execution state of the vertex represented by this management vertex.
*/
private ExecutionState executionState = ExecutionState.CREATED;
/**
* The name of the instance the vertex represented by this management vertex currently runs on.
*/
private String instanceName;
/**
* The type of the instance the vertex represented by this management vertex currently runs on.
*/
private String instanceType;
/**
* The index of this vertex in the management group vertex it belongs to.
*/
private final int indexInGroup;
/**
* The error message when executionState is FAILED.
*/
private String optMessage;
/**
* Constructs a new management vertex.
*
* @param groupVertex
* the management group vertex the new vertex belongs to
* @param id
* the ID of the new management vertex
* @param instanceName
* the name of the instance the vertex represented by this new management vertex currently runs on
* @param instanceType
* the type of the instance the vertex represented by this new management vertex currently runs on
* @param checkpointState
* the state of the vertex's checkpoint
* @param indexInGroup
* the index of this vertex in the management group vertex it belongs to
*/
public ManagementVertex(final ManagementGroupVertex groupVertex, final ManagementVertexID id,
final String instanceName, final String instanceType, final int indexInGroup) {
this.groupVertex = groupVertex;
this.id = id;
this.instanceName = instanceName;
this.instanceType = instanceType;
this.indexInGroup = indexInGroup;
groupVertex.addGroupMember(this);
}
/**
* Adds a management gate to this vertex.
*
* @param gate
* the management gate to be added
*/
void addGate(final ManagementGate gate) {
if (gate.isInputGate()) {
this.inputGates.add(gate);
} else {
this.outputGates.add(gate);
}
}
/**
* Returns the name of the instance the vertex represented by this management vertex currently runs on.
*
* @return the name of the instance the vertex represented by this management vertex currently runs on
*/
public String getInstanceName() {
return this.instanceName;
}
/**
* Returns the type of the instance the vertex represented by this management vertex currently runs on.
*
* @return the type of the instance the vertex represented by this management vertex currently runs on
*/
public String getInstanceType() {
return this.instanceType;
}
/**
* Returns the number of input gates this management vertex contains.
*
* @return the number of input gates this management vertex contains
*/
public int getNumberOfInputGates() {
return this.inputGates.size();
}
/**
* Returns the number of output gates this management vertex contains.
*
* @return the number of output gates this management vertex contains
*/
public int getNumberOfOutputGates() {
return this.outputGates.size();
}
/**
* Returns the input gate at the given index.
*
* @param index
* the index of the input gate to be returned
* @return the input gate at the given index or null
if no such input gate exists
*/
public ManagementGate getInputGate(final int index) {
if (index < this.inputGates.size()) {
return this.inputGates.get(index);
}
return null;
}
/**
* Returns the output gate at the given index.
*
* @param index
* the index of the output gate to be returned
* @return the output gate at the given index or null
if no such output gate exists
*/
public ManagementGate getOutputGate(final int index) {
if (index < this.outputGates.size()) {
return this.outputGates.get(index);
}
return null;
}
/**
* Returns the group vertex this management vertex belongs to.
*
* @return the group vertex this management vertex belongs to
*/
public ManagementGroupVertex getGroupVertex() {
return this.groupVertex;
}
/**
* The management graph this management vertex belongs to.
*
* @return the management graph this management vertex belongs to
*/
public ManagementGraph getGraph() {
return this.groupVertex.getGraph();
}
/**
* Returns the ID of this management vertex.
*
* @return the ID of this management vertex
*/
public ManagementVertexID getID() {
return this.id;
}
/**
* Returns the name of this management vertex.
*
* @return the name of this management vertex, possibly null
*/
public String getName() {
return this.groupVertex.getName();
}
/**
* Returns the number of vertices which belong to the same group vertex as this management vertex.
*
* @return the number of vertices which belong to the same group vertex as this management vertex
*/
public int getNumberOfVerticesInGroup() {
return this.groupVertex.getNumberOfGroupMembers();
}
/**
* Returns the index at which this vertex is stored inside its corresponding group vertex.
*
* @return the index at which this vertex is stored inside its corresponding group vertex
*/
public int getIndexInGroup() {
return this.indexInGroup;
}
/**
* Sets the current execution state of this management vertex.
*
* @param executionState
* the current execution state of this vertex
*/
public void setExecutionState(final ExecutionState executionState) {
this.executionState = executionState;
}
/**
* Returns the current execution state of this management vertex.
*
* @return the current execution state of this management vertex
*/
public ExecutionState getExecutionState() {
return this.executionState;
}
/**
* Sets the name of the instance this vertex currently runs on.
*
* @param instanceName
* the name of the instance this vertex currently runs on
*/
public void setInstanceName(final String instanceName) {
this.instanceName = instanceName;
}
/**
* Sets the type of instance this vertex currently runs on.
*
* @param instanceType
* the type of instance this vertex currently runs on
*/
public void setInstanceType(final String instanceType) {
this.instanceType = instanceType;
}
public void setOptMessage(final String optMessage) {
this.optMessage = optMessage;
}
public String getOptMessage() {
return this.optMessage;
}
@Override
public void read(final DataInput in) throws IOException {
// Read the execution state
this.executionState = EnumUtils.readEnum(in, ExecutionState.class);
// Read number of input gates
int numberOfInputGates = in.readInt();
for (int i = 0; i < numberOfInputGates; i++) {
new ManagementGate(this, new ManagementGateID(), i, true);
}
// Read number of input gates
int numberOfOutputGates = in.readInt();
for (int i = 0; i < numberOfOutputGates; i++) {
new ManagementGate(this, new ManagementGateID(), i, false);
}
this.instanceName = StringRecord.readString(in);
this.instanceType = StringRecord.readString(in);
}
@Override
public void write(final DataOutput out) throws IOException {
// Write the execution state
EnumUtils.writeEnum(out, this.executionState);
// Write out number of input gates
out.writeInt(this.inputGates.size());
// Write out number of output gates
out.writeInt(this.outputGates.size());
StringRecord.writeString(out, this.instanceName);
StringRecord.writeString(out, this.instanceType);
}
@Override
public String toString() {
return String.format("%s_%d", getGroupVertex().getName(), indexInGroup);
}
/**
* Returns Json representation of this ManagementVertex
*
* @return
*/
public String toJson() {
StringBuilder json = new StringBuilder("");
json.append("{");
json.append("\"vertexid\": \"" + this.getID() + "\",");
json.append("\"vertexname\": \"" + StringUtils.escapeHtml(this.toString()) + "\",");
json.append("\"vertexstatus\": \"" + this.getExecutionState() + "\",");
json.append("\"vertexinstancename\": \"" + this.getInstanceName() + "\",");
json.append("\"vertexinstancetype\": \"" + this.getInstanceType() + "\"");
json.append("}");
return json.toString();
}
}