Skip to content

Commit dbb9feb

Browse files
sluongngiancha1992
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 bf82e7b commit dbb9feb

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
@@ -489,11 +489,12 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
489489
//
490490
// If they point to different endpoints, we check the endpoint with execution or cache
491491
// capabilities respectively.
492+
ServerCapabilities executionCapabilities = null;
492493
ServerCapabilities cacheCapabilities = null;
493494
try {
494495
if (execChannel != null) {
495496
if (cacheChannel != execChannel) {
496-
var unused =
497+
executionCapabilities =
497498
getAndVerifyServerCapabilities(
498499
remoteOptions,
499500
execChannel,
@@ -521,6 +522,7 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
521522
env,
522523
digestUtil,
523524
ServerCapabilitiesRequirement.EXECUTION_AND_CACHE);
525+
executionCapabilities = cacheCapabilities;
524526
}
525527
} else {
526528
cacheCapabilities =
@@ -601,7 +603,11 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
601603
Retrier.ALLOW_ALL_CALLS);
602604
remoteExecutor =
603605
new ExperimentalGrpcRemoteExecutor(
604-
remoteOptions, execChannel.retain(), callCredentialsProvider, execRetrier);
606+
executionCapabilities,
607+
remoteOptions,
608+
execChannel.retain(),
609+
callCredentialsProvider,
610+
execRetrier);
605611
} else {
606612
RemoteRetrier execRetrier =
607613
new RemoteRetrier(
@@ -610,7 +616,8 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
610616
retryScheduler,
611617
Retrier.ALLOW_ALL_CALLS);
612618
remoteExecutor =
613-
new GrpcRemoteExecutor(execChannel.retain(), callCredentialsProvider, execRetrier);
619+
new GrpcRemoteExecutor(
620+
executionCapabilities, execChannel.retain(), callCredentialsProvider, execRetrier);
614621
}
615622
execChannel.release();
616623
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;
@@ -198,13 +200,13 @@ public final void setUp() throws Exception {
198200
new FakeOwner("Mnemonic", "Progress Message", "//dummy:label"),
199201
ImmutableList.of("/bin/echo", "Hi!"),
200202
ImmutableMap.of("VARIABLE", "value"),
201-
/*executionInfo=*/ ImmutableMap.<String, String>of(),
202-
/*runfilesSupplier=*/ null,
203-
/*filesetMappings=*/ ImmutableMap.of(),
204-
/*inputs=*/ NestedSetBuilder.create(
203+
/* executionInfo= */ ImmutableMap.<String, String>of(),
204+
/* runfilesSupplier= */ null,
205+
/* filesetMappings= */ ImmutableMap.of(),
206+
/* inputs= */ NestedSetBuilder.create(
205207
Order.STABLE_ORDER, ActionInputHelper.fromPath("input")),
206-
/*tools=*/ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
207-
/*outputs=*/ ImmutableSet.of(
208+
/* tools= */ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
209+
/* outputs= */ ImmutableSet.of(
208210
new ActionInput() {
209211
@Override
210212
public String getExecPathString() {
@@ -247,7 +249,7 @@ public PathFragment getExecPath() {
247249
return PathFragment.create("bar");
248250
}
249251
}),
250-
/*mandatoryOutputs=*/ ImmutableSet.of(),
252+
/* mandatoryOutputs= */ ImmutableSet.of(),
251253
ResourceSet.ZERO);
252254

253255
Path stdout = fs.getPath("/tmp/stdout");
@@ -295,8 +297,14 @@ public int maxConcurrency() {
295297
return 100;
296298
}
297299
});
300+
ServerCapabilities caps =
301+
ServerCapabilities.newBuilder()
302+
.setExecutionCapabilities(
303+
ExecutionCapabilities.newBuilder().setExecEnabled(true).build())
304+
.build();
298305
GrpcRemoteExecutor executor =
299-
new GrpcRemoteExecutor(channel.retain(), CallCredentialsProvider.NO_CREDENTIALS, retrier);
306+
new GrpcRemoteExecutor(
307+
caps, channel.retain(), CallCredentialsProvider.NO_CREDENTIALS, retrier);
300308
CallCredentialsProvider callCredentialsProvider =
301309
GoogleAuthUtils.newCallCredentialsProvider(null);
302310
GrpcCacheClient cacheProtocol =
@@ -326,7 +334,7 @@ public int maxConcurrency() {
326334
remoteOptions,
327335
Options.getDefaults(ExecutionOptions.class),
328336
/* verboseFailures= */ true,
329-
/*cmdlineReporter=*/ null,
337+
/* cmdlineReporter= */ null,
330338
retryService,
331339
logDir,
332340
remoteExecutionService);

0 commit comments

Comments
 (0)