Remote: Register "remote" strategy even if remote execution is not available.
So that you can set a `--spawn_strategy` that includes `remote` without setting `--remote_executor`. In addition, if `--remote_local_fallback` is set and `remote_executor` is unreachable when build starts, Bazel will fallback to next available strategy.
Fixes #13340 and #13487.
Closes #13490.
PiperOrigin-RevId: 378339904
diff --git a/src/test/java/com/google/devtools/build/lib/remote/RemoteModuleTest.java b/src/test/java/com/google/devtools/build/lib/remote/RemoteModuleTest.java
index 342c481..5b41d27 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/RemoteModuleTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/RemoteModuleTest.java
@@ -430,7 +430,10 @@
remoteModule.beforeCommand(env);
assertThat(Thread.interrupted()).isFalse();
- assertThat(remoteModule.getActionContextProvider()).isNull();
+ RemoteActionContextProvider actionContextProvider = remoteModule.getActionContextProvider();
+ assertThat(actionContextProvider).isNotNull();
+ assertThat(actionContextProvider.getRemoteCache()).isNull();
+ assertThat(actionContextProvider.getRemoteExecutionClient()).isNull();
} finally {
cacheServer.shutdownNow();
cacheServer.awaitTermination();
@@ -438,6 +441,44 @@
}
@Test
+ public void testLocalFallback_shouldIgnoreInaccessibleGrpcRemoteExecutor() throws Exception {
+ CapabilitiesImplBase executionServerCapabilitiesImpl =
+ new CapabilitiesImplBase() {
+ @Override
+ public void getCapabilities(
+ GetCapabilitiesRequest request, StreamObserver<ServerCapabilities> responseObserver) {
+ responseObserver.onError(new UnsupportedOperationException());
+ }
+ };
+ String executionServerName = "execution-server";
+ Server executionServer = createFakeServer(executionServerName, executionServerCapabilitiesImpl);
+ executionServer.start();
+
+ try {
+ RemoteModule remoteModule = new RemoteModule();
+ RemoteOptions remoteOptions = Options.getDefaults(RemoteOptions.class);
+ remoteOptions.remoteExecutor = executionServerName;
+ remoteOptions.remoteLocalFallback = true;
+ remoteModule.setChannelFactory(
+ (target, proxy, options, interceptors) ->
+ InProcessChannelBuilder.forName(target).directExecutor().build());
+
+ CommandEnvironment env = createTestCommandEnvironment(remoteOptions);
+
+ remoteModule.beforeCommand(env);
+
+ assertThat(Thread.interrupted()).isFalse();
+ RemoteActionContextProvider actionContextProvider = remoteModule.getActionContextProvider();
+ assertThat(actionContextProvider).isNotNull();
+ assertThat(actionContextProvider.getRemoteCache()).isNull();
+ assertThat(actionContextProvider.getRemoteExecutionClient()).isNull();
+ } finally {
+ executionServer.shutdownNow();
+ executionServer.awaitTermination();
+ }
+ }
+
+ @Test
public void testNetrc_emptyEnv_shouldIgnore() throws Exception {
Map<String, String> clientEnv = ImmutableMap.of();
FileSystem fileSystem = new InMemoryFileSystem(DigestHashFunction.SHA256);