Skip to content

Commit 82a7b8e

Browse files
sluongngfweikert
authored andcommitted
Add ServerCapabilities into RemoteExecutionClient
In bazelbuild#18202, we discussed the possibility of conditionally using the new field exclusively based on the Remote Execution Server's capabilities. Capture Remote Execution Server's capabilities and store it in RemoteExecutor implementations for furture usage. Closes bazelbuild#18269. PiperOrigin-RevId: 531999688 Change-Id: I370869a45c804af1ec499b9c1654c6977c7ab7d0
1 parent b4c90ad commit 82a7b8e

File tree

6 files changed

+58
-13
lines changed

6 files changed

+58
-13
lines changed

src/main/java/com/google/devtools/build/lib/remote/ExperimentalGrpcRemoteExecutor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import build.bazel.remote.execution.v2.ExecutionGrpc;
2121
import build.bazel.remote.execution.v2.ExecutionGrpc.ExecutionBlockingStub;
2222
import build.bazel.remote.execution.v2.RequestMetadata;
23+
import build.bazel.remote.execution.v2.ServerCapabilities;
2324
import build.bazel.remote.execution.v2.WaitExecutionRequest;
2425
import com.google.common.base.Preconditions;
2526
import com.google.devtools.build.lib.authandtls.CallCredentialsProvider;
@@ -56,6 +57,7 @@
5657
@ThreadSafe
5758
public class ExperimentalGrpcRemoteExecutor implements RemoteExecutionClient {
5859

60+
private final ServerCapabilities serverCapabilities;
5961
private final RemoteOptions remoteOptions;
6062
private final ReferenceCountedChannel channel;
6163
private final CallCredentialsProvider callCredentialsProvider;
@@ -64,10 +66,12 @@ public class ExperimentalGrpcRemoteExecutor implements RemoteExecutionClient {
6466
private final AtomicBoolean closed = new AtomicBoolean();
6567

6668
public ExperimentalGrpcRemoteExecutor(
69+
ServerCapabilities serverCapabilities,
6770
RemoteOptions remoteOptions,
6871
ReferenceCountedChannel channel,
6972
CallCredentialsProvider callCredentialsProvider,
7073
RemoteRetrier retrier) {
74+
this.serverCapabilities = serverCapabilities;
7175
this.remoteOptions = remoteOptions;
7276
this.channel = channel;
7377
this.callCredentialsProvider = callCredentialsProvider;
@@ -318,6 +322,11 @@ static ExecuteResponse extractResponseOrThrowIfError(Operation operation) throws
318322
}
319323
}
320324

325+
@Override
326+
public ServerCapabilities getServerCapabilities() {
327+
return this.serverCapabilities;
328+
}
329+
321330
@Override
322331
public ExecuteResponse executeRemotely(
323332
RemoteActionExecutionContext context, ExecuteRequest request, OperationObserver observer)

src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteExecutor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import build.bazel.remote.execution.v2.ExecutionGrpc;
2020
import build.bazel.remote.execution.v2.ExecutionGrpc.ExecutionBlockingStub;
2121
import build.bazel.remote.execution.v2.RequestMetadata;
22+
import build.bazel.remote.execution.v2.ServerCapabilities;
2223
import build.bazel.remote.execution.v2.WaitExecutionRequest;
2324
import com.google.common.base.Preconditions;
2425
import com.google.devtools.build.lib.authandtls.CallCredentialsProvider;
@@ -43,16 +44,19 @@
4344
@ThreadSafe
4445
class GrpcRemoteExecutor implements RemoteExecutionClient {
4546

47+
private final ServerCapabilities serverCapabilities;
4648
private final ReferenceCountedChannel channel;
4749
private final CallCredentialsProvider callCredentialsProvider;
4850
private final RemoteRetrier retrier;
4951

5052
private final AtomicBoolean closed = new AtomicBoolean();
5153

5254
public GrpcRemoteExecutor(
55+
ServerCapabilities serverCapabilities,
5356
ReferenceCountedChannel channel,
5457
CallCredentialsProvider callCredentialsProvider,
5558
RemoteRetrier retrier) {
59+
this.serverCapabilities = serverCapabilities;
5660
this.channel = channel;
5761
this.callCredentialsProvider = callCredentialsProvider;
5862
this.retrier = retrier;
@@ -89,6 +93,11 @@ private ExecuteResponse getOperationResponse(Operation op) throws IOException {
8993
return null;
9094
}
9195

96+
@Override
97+
public ServerCapabilities getServerCapabilities() {
98+
return this.serverCapabilities;
99+
}
100+
92101
/* Execute has two components: the Execute call and (optionally) the WaitExecution call.
93102
* This is the simple flow without any errors:
94103
*

src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -526,11 +526,12 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
526526
//
527527
// If they point to different endpoints, we check the endpoint with execution or cache
528528
// capabilities respectively.
529+
ServerCapabilities executionCapabilities = null;
529530
ServerCapabilities cacheCapabilities = null;
530531
try {
531532
if (execChannel != null) {
532533
if (cacheChannel != execChannel) {
533-
var unused =
534+
executionCapabilities =
534535
getAndVerifyServerCapabilities(
535536
remoteOptions,
536537
execChannel,
@@ -558,6 +559,7 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
558559
env,
559560
digestUtil,
560561
ServerCapabilitiesRequirement.EXECUTION_AND_CACHE);
562+
executionCapabilities = cacheCapabilities;
561563
}
562564
} else {
563565
cacheCapabilities =
@@ -639,7 +641,11 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
639641
Retrier.ALLOW_ALL_CALLS);
640642
remoteExecutor =
641643
new ExperimentalGrpcRemoteExecutor(
642-
remoteOptions, execChannel.retain(), callCredentialsProvider, execRetrier);
644+
executionCapabilities,
645+
remoteOptions,
646+
execChannel.retain(),
647+
callCredentialsProvider,
648+
execRetrier);
643649
} else {
644650
RemoteRetrier execRetrier =
645651
new RemoteRetrier(
@@ -648,7 +654,8 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
648654
retryScheduler,
649655
Retrier.ALLOW_ALL_CALLS);
650656
remoteExecutor =
651-
new GrpcRemoteExecutor(execChannel.retain(), callCredentialsProvider, execRetrier);
657+
new GrpcRemoteExecutor(
658+
executionCapabilities, execChannel.retain(), callCredentialsProvider, execRetrier);
652659
}
653660
execChannel.release();
654661
RemoteExecutionCache remoteCache =

src/main/java/com/google/devtools/build/lib/remote/common/RemoteExecutionClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import build.bazel.remote.execution.v2.ExecuteRequest;
1717
import build.bazel.remote.execution.v2.ExecuteResponse;
18+
import build.bazel.remote.execution.v2.ServerCapabilities;
1819
import java.io.IOException;
1920

2021
/**
@@ -24,6 +25,9 @@
2425
*/
2526
public interface RemoteExecutionClient {
2627

28+
/** Returns the cache capabilities of the remote execution server */
29+
ServerCapabilities getServerCapabilities();
30+
2731
/** Execute an action remotely using Remote Execution API. */
2832
ExecuteResponse executeRemotely(
2933
RemoteActionExecutionContext context, ExecuteRequest request, OperationObserver observer)

src/test/java/com/google/devtools/build/lib/remote/ExperimentalGrpcRemoteExecutorTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import build.bazel.remote.execution.v2.Digest;
2222
import build.bazel.remote.execution.v2.ExecuteRequest;
2323
import build.bazel.remote.execution.v2.ExecuteResponse;
24+
import build.bazel.remote.execution.v2.ExecutionCapabilities;
2425
import build.bazel.remote.execution.v2.OutputFile;
2526
import build.bazel.remote.execution.v2.RequestMetadata;
27+
import build.bazel.remote.execution.v2.ServerCapabilities;
2628
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
2729
import com.google.common.util.concurrent.MoreExecutors;
2830
import com.google.devtools.build.lib.authandtls.CallCredentialsProvider;
@@ -133,9 +135,15 @@ public int maxConcurrency() {
133135
}
134136
});
135137

138+
ServerCapabilities caps =
139+
ServerCapabilities.newBuilder()
140+
.setExecutionCapabilities(
141+
ExecutionCapabilities.newBuilder().setExecEnabled(true).build())
142+
.build();
143+
136144
executor =
137145
new ExperimentalGrpcRemoteExecutor(
138-
remoteOptions, channel, CallCredentialsProvider.NO_CREDENTIALS, retrier);
146+
caps, remoteOptions, channel, CallCredentialsProvider.NO_CREDENTIALS, retrier);
139147
}
140148

141149
@After

src/test/java/com/google/devtools/build/lib/remote/RemoteSpawnRunnerWithGrpcRemoteExecutorTest.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import build.bazel.remote.execution.v2.Directory;
3535
import build.bazel.remote.execution.v2.ExecuteRequest;
3636
import build.bazel.remote.execution.v2.ExecuteResponse;
37+
import build.bazel.remote.execution.v2.ExecutionCapabilities;
3738
import build.bazel.remote.execution.v2.ExecutionGrpc.ExecutionImplBase;
3839
import build.bazel.remote.execution.v2.FileNode;
3940
import build.bazel.remote.execution.v2.FindMissingBlobsRequest;
@@ -42,6 +43,7 @@
4243
import build.bazel.remote.execution.v2.OutputDirectory;
4344
import build.bazel.remote.execution.v2.OutputFile;
4445
import build.bazel.remote.execution.v2.RequestMetadata;
46+
import build.bazel.remote.execution.v2.ServerCapabilities;
4547
import build.bazel.remote.execution.v2.Tree;
4648
import build.bazel.remote.execution.v2.WaitExecutionRequest;
4749
import com.google.bytestream.ByteStreamGrpc.ByteStreamImplBase;
@@ -201,13 +203,13 @@ public final void setUp() throws Exception {
201203
new FakeOwner("Mnemonic", "Progress Message", "//dummy:label"),
202204
ImmutableList.of("/bin/echo", "Hi!"),
203205
ImmutableMap.of("VARIABLE", "value"),
204-
/*executionInfo=*/ ImmutableMap.<String, String>of(),
205-
/*runfilesSupplier=*/ null,
206-
/*filesetMappings=*/ ImmutableMap.of(),
207-
/*inputs=*/ NestedSetBuilder.create(
206+
/* executionInfo= */ ImmutableMap.<String, String>of(),
207+
/* runfilesSupplier= */ null,
208+
/* filesetMappings= */ ImmutableMap.of(),
209+
/* inputs= */ NestedSetBuilder.create(
208210
Order.STABLE_ORDER, ActionInputHelper.fromPath("input")),
209-
/*tools=*/ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
210-
/*outputs=*/ ImmutableSet.of(
211+
/* tools= */ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
212+
/* outputs= */ ImmutableSet.of(
211213
new ActionInput() {
212214
@Override
213215
public String getExecPathString() {
@@ -250,7 +252,7 @@ public PathFragment getExecPath() {
250252
return PathFragment.create("bar");
251253
}
252254
}),
253-
/*mandatoryOutputs=*/ ImmutableSet.of(),
255+
/* mandatoryOutputs= */ ImmutableSet.of(),
254256
ResourceSet.ZERO);
255257

256258
Path stdout = fs.getPath("/tmp/stdout");
@@ -298,8 +300,14 @@ public int maxConcurrency() {
298300
return 100;
299301
}
300302
});
303+
ServerCapabilities caps =
304+
ServerCapabilities.newBuilder()
305+
.setExecutionCapabilities(
306+
ExecutionCapabilities.newBuilder().setExecEnabled(true).build())
307+
.build();
301308
GrpcRemoteExecutor executor =
302-
new GrpcRemoteExecutor(channel.retain(), CallCredentialsProvider.NO_CREDENTIALS, retrier);
309+
new GrpcRemoteExecutor(
310+
caps, channel.retain(), CallCredentialsProvider.NO_CREDENTIALS, retrier);
303311
CallCredentialsProvider callCredentialsProvider =
304312
GoogleAuthUtils.newCallCredentialsProvider(null);
305313
GrpcCacheClient cacheProtocol =
@@ -330,7 +338,7 @@ public int maxConcurrency() {
330338
remoteOptions,
331339
Options.getDefaults(ExecutionOptions.class),
332340
/* verboseFailures= */ true,
333-
/*cmdlineReporter=*/ null,
341+
/* cmdlineReporter= */ null,
334342
retryService,
335343
logDir,
336344
remoteExecutionService);

0 commit comments

Comments
 (0)