public Collection<PartitionStats> call() {
// Thread initialization (for locality)
this.workerClientRequestProcessor =
new NettyWorkerClientRequestProcessor<I, V, E, M>(
context, configuration, serviceWorker);
WorkerThreadAggregatorUsage aggregatorUsage =
serviceWorker.getAggregatorHandler().newThreadAggregatorUsage();
this.graphState = new GraphState<I, V, E, M>(graphState.getSuperstep(),
graphState.getTotalNumVertices(), graphState.getTotalNumEdges(),
context, graphState.getGraphTaskManager(), workerClientRequestProcessor,
aggregatorUsage);
vertexWriter = serviceWorker.getSuperstepOutput().getVertexWriter();
List<PartitionStats> partitionStatsList = Lists.newArrayList();
while (!partitionIdQueue.isEmpty()) {
Integer partitionId = partitionIdQueue.poll();
if (partitionId == null) {
break;
}
Partition<I, V, E, M> partition =
serviceWorker.getPartitionStore().getPartition(partitionId);
try {
PartitionStats partitionStats = computePartition(partition);
partitionStatsList.add(partitionStats);
long partitionMsgs = workerClientRequestProcessor.resetMessageCount();
partitionStats.addMessagesSentCount(partitionMsgs);
messagesSentCounter.inc(partitionMsgs);
timedLogger.info("call: Completed " +
partitionStatsList.size() + " partitions, " +
partitionIdQueue.size() + " remaining " +
MemoryUtils.getRuntimeMemoryStats());
} catch (IOException e) {
throw new IllegalStateException("call: Caught unexpected IOException," +
" failing.", e);
} catch (InterruptedException e) {
throw new IllegalStateException("call: Caught unexpected " +
"InterruptedException, failing.", e);
} finally {
serviceWorker.getPartitionStore().putPartition(partition);
}
}
// Return VertexWriter after the usage
serviceWorker.getSuperstepOutput().returnVertexWriter(vertexWriter);
if (LOG.isInfoEnabled()) {
float seconds = Times.getNanosSince(TIME, startNanos) /
Time.NS_PER_SECOND_AS_FLOAT;
LOG.info("call: Computation took " + seconds + " secs for " +
partitionStatsList.size() + " partitions on superstep " +
graphState.getSuperstep() + ". Flushing started");
}
try {
workerClientRequestProcessor.flush();
aggregatorUsage.finishThreadComputation();
} catch (IOException e) {
throw new IllegalStateException("call: Flushing failed.", e);
}
return partitionStatsList;
}