// Copyright 2017 The Bazel Authors. All rights reserved. // // 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 com.google.devtools.build.lib.remote; import com.google.devtools.remoteexecution.v1test.ExecuteResponse; import com.google.rpc.Status; import io.grpc.Status.Code; import io.grpc.StatusRuntimeException; import javax.annotation.Nullable; /** * Exception to signal that a remote execution has failed with a certain status received from the * server, and other details, such as the action result and the server logs. The exception may be * retriable or not, depending on the status/details. */ public class ExecutionStatusException extends StatusRuntimeException { private final Status status; private final ExecuteResponse response; public ExecutionStatusException(Status status, @Nullable ExecuteResponse response) { super(convertStatus(status, response)); this.status = status; this.response = response; } private static io.grpc.Status convertStatus(Status status, @Nullable ExecuteResponse response) { io.grpc.Status result = io.grpc.Status.fromCodeValue( // Hack: convert to non-retriable exception on timeouts. isExecutionTimeout(status, response) ? Code.FAILED_PRECONDITION.value() : status.getCode()); return result.withDescription(status.getMessage()); } private static boolean isExecutionTimeout(Status status, @Nullable ExecuteResponse response) { return response != null && response.getStatus().equals(status) && status.getCode() == Code.DEADLINE_EXCEEDED.value(); } public boolean isExecutionTimeout() { return isExecutionTimeout(status, response); } @Nullable public ExecuteResponse getResponse() { return response; } }