blob: 9cb080b40219353047e97109b3b08b278f81244c [file] [log] [blame]
// Copyright 2016 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.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.remote.ExecuteServiceGrpc.ExecuteServiceBlockingStub;
import com.google.devtools.build.lib.remote.RemoteProtocol.ExecuteReply;
import com.google.devtools.build.lib.remote.RemoteProtocol.ExecuteRequest;
import com.google.devtools.build.lib.remote.RemoteProtocol.ExecutionStatus;
import io.grpc.ManagedChannel;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
/** A remote work executor that uses gRPC for communicating the work, inputs and outputs. */
@ThreadSafe
public class RemoteWorkExecutor {
/** Channel over which to send work to run remotely. */
private final ManagedChannel channel;
private final int grpcTimeoutSeconds;
public RemoteWorkExecutor(RemoteOptions options) throws InvalidConfigurationException {
channel = RemoteUtils.createChannel(options.remoteWorker);
grpcTimeoutSeconds = options.grpcTimeoutSeconds;
}
public static boolean isRemoteExecutionOptions(RemoteOptions options) {
return options.remoteWorker != null;
}
public ExecuteReply executeRemotely(ExecuteRequest request) {
ExecuteServiceBlockingStub stub =
ExecuteServiceGrpc.newBlockingStub(channel)
.withDeadlineAfter(
grpcTimeoutSeconds + request.getTimeoutMillis() / 1000, TimeUnit.SECONDS);
Iterator<ExecuteReply> replies = stub.execute(request);
ExecuteReply reply = null;
while (replies.hasNext()) {
reply = replies.next();
// We can handle the action execution progress here.
}
if (reply == null) {
return ExecuteReply.newBuilder()
.setStatus(
ExecutionStatus.newBuilder()
.setExecuted(false)
.setSucceeded(false)
.setError(ExecutionStatus.ErrorCode.UNKNOWN_ERROR)
.setErrorDetail("Remote server terminated the connection"))
.build();
}
return reply;
}
}