Skip to content

Commit 0b1f889

Browse files
rahul2393release-please[bot]
authored andcommitted
chore: preserve default TLS authority for bypass-routed channels (#4396)
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
1 parent c232978 commit 0b1f889

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GrpcChannelEndpointCache.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,17 @@
1919
import com.google.api.core.InternalApi;
2020
import com.google.api.gax.grpc.GrpcTransportChannel;
2121
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
22+
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.Builder;
2223
import com.google.api.gax.rpc.TransportChannelProvider;
2324
import com.google.cloud.spanner.ErrorCode;
2425
import com.google.cloud.spanner.SpannerExceptionFactory;
2526
import com.google.common.annotations.VisibleForTesting;
2627
import io.grpc.ConnectivityState;
2728
import io.grpc.ManagedChannel;
29+
import io.grpc.ManagedChannelBuilder;
2830
import java.io.IOException;
2931
import java.util.Map;
32+
import java.util.Objects;
3033
import java.util.concurrent.ConcurrentHashMap;
3134
import java.util.concurrent.TimeUnit;
3235
import java.util.concurrent.atomic.AtomicBoolean;
@@ -47,6 +50,7 @@ class GrpcChannelEndpointCache implements ChannelEndpointCache {
4750
private final InstantiatingGrpcChannelProvider baseProvider;
4851
private final Map<String, GrpcChannelEndpoint> servers = new ConcurrentHashMap<>();
4952
private final GrpcChannelEndpoint defaultEndpoint;
53+
private final String defaultAuthority;
5054
private final AtomicBoolean isShutdown = new AtomicBoolean(false);
5155

5256
/**
@@ -61,6 +65,7 @@ public GrpcChannelEndpointCache(InstantiatingGrpcChannelProvider channelProvider
6165
this.baseProvider = channelProvider;
6266
String defaultEndpoint = channelProvider.getEndpoint();
6367
this.defaultEndpoint = new GrpcChannelEndpoint(defaultEndpoint, channelProvider);
68+
this.defaultAuthority = this.defaultEndpoint.getChannel().authority();
6469
this.servers.put(defaultEndpoint, this.defaultEndpoint);
6570
}
6671

@@ -82,7 +87,7 @@ public ChannelEndpoint get(String address) {
8287
try {
8388
// Create a new provider with the same config but different endpoint.
8489
// This is thread-safe as withEndpoint() returns a new provider instance.
85-
TransportChannelProvider newProvider = baseProvider.withEndpoint(addr);
90+
TransportChannelProvider newProvider = createProviderWithAuthorityOverride(addr);
8691
return new GrpcChannelEndpoint(addr, newProvider);
8792
} catch (IOException e) {
8893
throw SpannerExceptionFactory.newSpannerException(
@@ -91,6 +96,26 @@ public ChannelEndpoint get(String address) {
9196
});
9297
}
9398

99+
private TransportChannelProvider createProviderWithAuthorityOverride(String address) {
100+
InstantiatingGrpcChannelProvider endpointProvider =
101+
(InstantiatingGrpcChannelProvider) baseProvider.withEndpoint(address);
102+
if (Objects.equals(defaultAuthority, address)) {
103+
return endpointProvider;
104+
}
105+
Builder builder = endpointProvider.toBuilder();
106+
final com.google.api.core.ApiFunction<ManagedChannelBuilder, ManagedChannelBuilder>
107+
baseConfigurator = builder.getChannelConfigurator();
108+
builder.setChannelConfigurator(
109+
channelBuilder -> {
110+
ManagedChannelBuilder effectiveBuilder = channelBuilder;
111+
if (baseConfigurator != null) {
112+
effectiveBuilder = baseConfigurator.apply(effectiveBuilder);
113+
}
114+
return effectiveBuilder.overrideAuthority(defaultAuthority);
115+
});
116+
return builder.build();
117+
}
118+
94119
@Override
95120
public void evict(String address) {
96121
if (defaultEndpoint.getAddress().equals(address)) {

java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GrpcChannelEndpointCacheTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ public void getCachesPerAddress() throws Exception {
6060
}
6161
}
6262

63+
@Test
64+
public void routedChannelsReuseDefaultAuthority() throws Exception {
65+
GrpcChannelEndpointCache cache = new GrpcChannelEndpointCache(createProvider("localhost:1234"));
66+
try {
67+
ChannelEndpoint routed = cache.get("localhost:1111");
68+
69+
assertThat(routed.getChannel().authority()).isEqualTo("localhost:1234");
70+
} finally {
71+
cache.shutdown();
72+
}
73+
}
74+
6375
@Test
6476
public void evictRemovesNonDefaultServer() throws Exception {
6577
GrpcChannelEndpointCache cache = new GrpcChannelEndpointCache(createProvider("localhost:1234"));

0 commit comments

Comments
 (0)