in src/main/java/build/buildfarm/worker/ReportResultStage.java [86:199]
private OperationContext reportPolled(OperationContext operationContext)
throws InterruptedException {
String operationName = operationContext.operation.getName();
ActionResult.Builder resultBuilder = operationContext.executeResponse.getResultBuilder();
resultBuilder
.getExecutionMetadataBuilder()
.setOutputUploadStartTimestamp(Timestamps.fromMillis(System.currentTimeMillis()));
boolean blacklist = false;
try {
workerContext.uploadOutputs(
operationContext.queueEntry.getExecuteEntry().getActionDigest(),
resultBuilder,
operationContext.execDir,
operationContext.command.getOutputFilesList(),
operationContext.command.getOutputDirectoriesList());
} catch (StatusException e) {
ExecuteResponse executeResponse = operationContext.executeResponse.build();
if (executeResponse.getStatus().getCode() == Code.OK.getNumber()
&& executeResponse.getResult().getExitCode() == 0) {
// something about the outputs was malformed - fail the operation with this status if not
// already failing
Status status = StatusProto.fromThrowable(e);
if (status == null) {
logger.log(
Level.SEVERE, String.format("no rpc status from exception for %s", operationName), e);
status = asExecutionStatus(e);
}
operationContext.executeResponse.setStatus(status);
if (isRetriable(status)) {
blacklist = true;
}
}
} catch (InterruptedException | ClosedByInterruptException e) {
// cancellation here should not be logged
return null;
} catch (IOException e) {
logger.log(Level.SEVERE, String.format("error uploading outputs for %s", operationName), e);
return null;
}
Operation operation = operationContext.operation;
ExecuteOperationMetadata metadata;
try {
metadata =
operation
.getMetadata()
.unpack(ExecutingOperationMetadata.class)
.getExecuteOperationMetadata();
} catch (InvalidProtocolBufferException e) {
logger.log(
Level.SEVERE,
String.format("invalid execute operation metadata for %s", operationName),
e);
return null;
}
Timestamp now = Timestamps.fromMillis(System.currentTimeMillis());
resultBuilder
.getExecutionMetadataBuilder()
.setWorkerCompletedTimestamp(now)
.setOutputUploadCompletedTimestamp(now);
ExecuteResponse executeResponse = operationContext.executeResponse.build();
if (blacklist
|| (!operationContext.action.getDoNotCache()
&& executeResponse.getStatus().getCode() == Code.OK.getNumber()
&& executeResponse.getResult().getExitCode() == 0)) {
try {
if (blacklist) {
workerContext.blacklistAction(metadata.getActionDigest().getHash());
} else {
workerContext.putActionResult(
DigestUtil.asActionKey(metadata.getActionDigest()), executeResponse.getResult());
}
} catch (IOException e) {
logger.log(
Level.SEVERE, String.format("error reporting action result for %s", operationName), e);
return null;
}
}
CompletedOperationMetadata completedMetadata =
CompletedOperationMetadata.newBuilder()
.setExecuteOperationMetadata(metadata.toBuilder().setStage(COMPLETED).build())
.setRequestMetadata(operationContext.queueEntry.getExecuteEntry().getRequestMetadata())
.build();
Operation completedOperation =
operation
.toBuilder()
.setDone(true)
.setMetadata(Any.pack(completedMetadata))
.setResponse(Any.pack(executeResponse))
.build();
operationContext.poller.pause();
try {
if (!workerContext.putOperation(completedOperation)) {
return null;
}
} catch (IOException e) {
logger.log(
Level.SEVERE,
String.format("error reporting operation complete for %s", operationName),
e);
return null;
}
return operationContext.toBuilder().setOperation(completedOperation).build();
}