/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.giraph.debugger.instrumenter;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.giraph.debugger.utils.DebuggerUtils;
import org.apache.giraph.debugger.utils.DebuggerUtils.DebugTrace;
import org.apache.giraph.debugger.utils.ExceptionWrapper;
import org.apache.giraph.debugger.utils.GiraphMasterScenarioWrapper;
import org.apache.giraph.master.MasterCompute;
import org.apache.hadoop.io.Writable;
import org.apache.log4j.Logger;
/**
* Class that intercepts calls to {@link MasterCompute}'s exposed methods for
* GiraphDebugger.
*/
public abstract class AbstractInterceptingMasterCompute extends MasterCompute {
/**
* Logger for this class.
*/
protected static final Logger LOG = Logger
.getLogger(AbstractInterceptingMasterCompute.class);
/**
* The master scenario being captured.
*/
private GiraphMasterScenarioWrapper giraphMasterScenarioWrapper;
/**
* The utility for intercepting master computes.
*/
private CommonVertexMasterInterceptionUtil commonVertexMasterInterceptionUtil;
/**
* Called immediately as user's {@link MasterCompute#compute()} method is
* entered.
*/
public void interceptComputeBegin() {
LOG.info(this.getClass().getName() + ".interceptInitializeEnd is called ");
giraphMasterScenarioWrapper = new GiraphMasterScenarioWrapper(this
.getClass().getName());
if (commonVertexMasterInterceptionUtil == null) {
commonVertexMasterInterceptionUtil = new
CommonVertexMasterInterceptionUtil(getContext().getJobID().toString());
}
commonVertexMasterInterceptionUtil.initCommonVertexMasterContextWrapper(
getConf(), getSuperstep(), getTotalNumVertices(), getTotalNumEdges());
giraphMasterScenarioWrapper
.setCommonVertexMasterContextWrapper(commonVertexMasterInterceptionUtil
.getCommonVertexMasterContextWrapper());
}
/**
* Intercepts the call to {@link MasterCompute#getAggregatedValue(String)} to
* capture aggregator values at each superstep.
*
* @param <A>
* The type of the aggregator value.
* @param name
* The name of the Giraph aggregator.
* @return The aggregator value returned by the original
* {@link MasterCompute#getAggregatedValue(String)}.
*/
@Intercept(renameTo = "getAggregatedValue")
public <A extends Writable> A getAggregatedValueIntercept(String name) {
A retVal = super.<A>getAggregatedValue(name);
commonVertexMasterInterceptionUtil.addAggregatedValueIfNotExists(name,
retVal);
return retVal;
}
/**
* Called when user's {@link MasterCompute#compute()} method throws an
* exception.
*
* @param e
* exception thrown.
*/
protected final void interceptComputeException(Exception e) {
LOG.info("Caught an exception in user's MasterCompute. message: " +
e.getMessage() + ". Saving a trace in HDFS.");
ExceptionWrapper exceptionWrapper = new ExceptionWrapper(e.getMessage(),
ExceptionUtils.getStackTrace(e));
giraphMasterScenarioWrapper.setExceptionWrapper(exceptionWrapper);
commonVertexMasterInterceptionUtil.saveScenarioWrapper(
giraphMasterScenarioWrapper, DebuggerUtils.getFullMasterTraceFileName(
DebugTrace.MASTER_EXCEPTION,
commonVertexMasterInterceptionUtil.getJobId(), getSuperstep()));
}
/**
* Called after user's {@link MasterCompute#compute()} method returns.
*/
public void interceptComputeEnd() {
commonVertexMasterInterceptionUtil.saveScenarioWrapper(
giraphMasterScenarioWrapper, DebuggerUtils.getFullMasterTraceFileName(
DebugTrace.MASTER_REGULAR,
commonVertexMasterInterceptionUtil.getJobId(), getSuperstep()));
}
@Override
public void readFields(DataInput arg0) throws IOException {
}
@Override
public void write(DataOutput arg0) throws IOException {
}
}