Skip to content

Commit d7adb9a

Browse files
coeuvrecopybara-github
authored andcommitted
Don't issue GetCapabilities calls if the requirement is NONE
Because the endpoint might not implement the `GetCapabilities` API, e.g. Remote Asset API. Fixes #20342. Closes #20355. PiperOrigin-RevId: 586642258 Change-Id: If9ca3a1909729ea5d9410b7198bcacb5d67781aa
1 parent d34dc2a commit d7adb9a

13 files changed

+76
-18
lines changed

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ public interface ChannelConnectionWithServerCapabilitiesFactory extends ChannelC
2828

2929
/** A {@link ChannelConnection} that provides {@link ServerCapabilities}. */
3030
class ChannelConnectionWithServerCapabilities extends ChannelConnection {
31-
private final ServerCapabilities serverCapabilities;
31+
private final Single<ServerCapabilities> serverCapabilities;
3232

3333
public ChannelConnectionWithServerCapabilities(
34-
ManagedChannel channel, ServerCapabilities serverCapabilities) {
34+
ManagedChannel channel, Single<ServerCapabilities> serverCapabilities) {
3535
super(channel);
3636
this.serverCapabilities = serverCapabilities;
3737
}
3838

39-
public ServerCapabilities getServerCapabilities() {
39+
public Single<ServerCapabilities> getServerCapabilities() {
4040
return serverCapabilities;
4141
}
4242
}

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

+15-6
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,21 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
9494
return Single.fromCallable(
9595
() -> channelFactory.newChannel(target, proxy, options, interceptors))
9696
.flatMap(
97-
channel ->
98-
RxFutures.toSingle(() -> getAndVerifyServerCapabilities(channel), directExecutor())
99-
.map(
100-
serverCapabilities ->
101-
new ChannelConnectionWithServerCapabilities(
102-
channel, serverCapabilities)));
97+
channel -> {
98+
var serverCapabilitiesSingle =
99+
RxFutures.toSingle(
100+
() -> getAndVerifyServerCapabilities(channel), directExecutor());
101+
102+
// Don't issue GetCapabilities calls if the requirement is NONE because the endpoint,
103+
// e.g. Remote Asset API, might not implement the API. See #20342.
104+
if (requirement == ServerCapabilitiesRequirement.NONE) {
105+
return Single.just(
106+
new ChannelConnectionWithServerCapabilities(channel, serverCapabilitiesSingle));
107+
}
108+
109+
return serverCapabilitiesSingle.map(
110+
sc -> new ChannelConnectionWithServerCapabilities(channel, Single.just(sc)));
111+
});
103112
}
104113

105114
private ListenableFuture<ServerCapabilities> getAndVerifyServerCapabilities(

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ public ReferenceCountedChannel(
7777
public ServerCapabilities getServerCapabilities() throws IOException {
7878
try (var s = Profiler.instance().profile("getServerCapabilities")) {
7979
return blockingGet(
80-
withChannelConnection(
81-
channelConnection -> Single.just(channelConnection.getServerCapabilities())));
80+
withChannelConnection(ChannelConnectionWithServerCapabilities::getServerCapabilities));
8281
} catch (ExecutionException e) {
8382
throw new IOException(e);
8483
} catch (InterruptedException e) {

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

+5
Original file line numberDiff line numberDiff line change
@@ -1132,4 +1132,9 @@ static Credentials createCredentials(
11321132

11331133
return credentials;
11341134
}
1135+
1136+
@VisibleForTesting
1137+
MutableSupplier<Downloader> getRemoteDownloaderSupplier() {
1138+
return remoteDownloaderSupplier;
1139+
}
11351140
}

src/main/java/com/google/devtools/build/lib/remote/downloader/GrpcRemoteDownloader.java

+5
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,9 @@ private OutputStream newOutputStream(Path destination, Optional<Checksum> checks
199199
}
200200
return out;
201201
}
202+
203+
@VisibleForTesting
204+
public ReferenceCountedChannel getChannel() {
205+
return channel;
206+
}
202207
}

src/test/java/com/google/devtools/build/lib/remote/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ java_library(
104104
"//src/main/java/com/google/devtools/build/lib/remote/common:bulk_transfer_exception",
105105
"//src/main/java/com/google/devtools/build/lib/remote/common:cache_not_found_exception",
106106
"//src/main/java/com/google/devtools/build/lib/remote/disk",
107+
"//src/main/java/com/google/devtools/build/lib/remote/downloader",
107108
"//src/main/java/com/google/devtools/build/lib/remote/http",
108109
"//src/main/java/com/google/devtools/build/lib/remote/merkletree",
109110
"//src/main/java/com/google/devtools/build/lib/remote/options",

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
131131
return Single.just(
132132
new ChannelConnectionWithServerCapabilities(
133133
InProcessChannelBuilder.forName(serverName).build(),
134-
ServerCapabilities.getDefaultInstance()));
134+
Single.just(ServerCapabilities.getDefaultInstance())));
135135
}
136136

137137
@Override

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
127127
return Single.just(
128128
new ChannelConnectionWithServerCapabilities(
129129
InProcessChannelBuilder.forName(serverName).build(),
130-
ServerCapabilities.getDefaultInstance()));
130+
Single.just(ServerCapabilities.getDefaultInstance())));
131131
}
132132

133133
@Override
@@ -1069,7 +1069,7 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
10691069
InProcessChannelBuilder.forName(serverName)
10701070
.intercept(MetadataUtils.newAttachHeadersInterceptor(metadata))
10711071
.build(),
1072-
ServerCapabilities.getDefaultInstance()));
1072+
Single.just(ServerCapabilities.getDefaultInstance())));
10731073
}
10741074

10751075
@Override

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
195195
.build();
196196
return Single.just(
197197
new ChannelConnectionWithServerCapabilities(
198-
ch, ServerCapabilities.getDefaultInstance()));
198+
ch, Single.just(ServerCapabilities.getDefaultInstance())));
199199
}
200200

201201
@Override

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
117117
.setExecutionCapabilities(
118118
ExecutionCapabilities.newBuilder().setExecEnabled(true).build())
119119
.build();
120-
return Single.just(new ChannelConnectionWithServerCapabilities(ch, caps));
120+
return Single.just(
121+
new ChannelConnectionWithServerCapabilities(ch, Single.just(caps)));
121122
}
122123

123124
@Override

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

+37
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.google.devtools.build.lib.exec.ExecutionOptions;
4444
import com.google.devtools.build.lib.pkgcache.PackageOptions;
4545
import com.google.devtools.build.lib.remote.circuitbreaker.FailureCircuitBreaker;
46+
import com.google.devtools.build.lib.remote.downloader.GrpcRemoteDownloader;
4647
import com.google.devtools.build.lib.remote.options.RemoteOptions;
4748
import com.google.devtools.build.lib.runtime.BlazeRuntime;
4849
import com.google.devtools.build.lib.runtime.BlazeServerStartupOptions;
@@ -221,6 +222,42 @@ public void initialize() {
221222
remoteOptions = Options.getDefaults(RemoteOptions.class);
222223
}
223224

225+
@Test
226+
public void testVerifyCapabilities_none() throws Exception {
227+
// Test that Bazel doesn't issue GetCapabilities calls if the requirement is NONE.
228+
// Regression test for https://github.com/bazelbuild/bazel/issues/20342.
229+
CapabilitiesImpl executionServerCapabilitiesImpl = new CapabilitiesImpl(EXEC_AND_CACHE_CAPS);
230+
Server executionServer =
231+
createFakeServer(EXECUTION_SERVER_NAME, executionServerCapabilitiesImpl);
232+
executionServer.start();
233+
234+
CapabilitiesImpl cacheCapabilitiesImpl = new CapabilitiesImpl(CACHE_ONLY_CAPS);
235+
Server cacheServer = createFakeServer(CACHE_SERVER_NAME, cacheCapabilitiesImpl);
236+
cacheServer.start();
237+
238+
try {
239+
remoteOptions.remoteExecutor = EXECUTION_SERVER_NAME;
240+
remoteOptions.remoteDownloader = CACHE_SERVER_NAME;
241+
242+
beforeCommand();
243+
244+
// Wait for the channel to be connected.
245+
var downloader = (GrpcRemoteDownloader) remoteModule.getRemoteDownloaderSupplier().get();
246+
var unused = downloader.getChannel().withChannelBlocking(ch -> new Object());
247+
248+
// Remote downloader uses Remote Asset API, and Bazel doesn't have any capability requirement
249+
// on the endpoint. Expecting the request count is 0.
250+
assertThat(cacheCapabilitiesImpl.getRequestCount()).isEqualTo(0);
251+
assertCircuitBreakerInstance();
252+
} finally {
253+
executionServer.shutdownNow();
254+
cacheServer.shutdownNow();
255+
256+
executionServer.awaitTermination();
257+
cacheServer.awaitTermination();
258+
}
259+
}
260+
224261
@Test
225262
public void testVerifyCapabilities_executionAndCacheForSingleEndpoint() throws Exception {
226263
CapabilitiesImpl executionServerCapabilitiesImpl = new CapabilitiesImpl(EXEC_AND_CACHE_CAPS);

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,8 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
313313
.setExecutionCapabilities(
314314
ExecutionCapabilities.newBuilder().setExecEnabled(true).build())
315315
.build();
316-
return Single.just(new ChannelConnectionWithServerCapabilities(ch, caps));
316+
return Single.just(
317+
new ChannelConnectionWithServerCapabilities(ch, Single.just(caps)));
317318
}
318319

319320
@Override

src/test/java/com/google/devtools/build/lib/remote/downloader/GrpcRemoteDownloaderTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public Single<ChannelConnectionWithServerCapabilities> create() {
145145
InProcessChannelBuilder.forName(fakeServerName).directExecutor().build();
146146
return Single.just(
147147
new ChannelConnectionWithServerCapabilities(
148-
ch, ServerCapabilities.getDefaultInstance()));
148+
ch, Single.just(ServerCapabilities.getDefaultInstance())));
149149
}
150150

151151
@Override

0 commit comments

Comments
 (0)