1919import com .google .api .core .InternalApi ;
2020import com .google .api .gax .grpc .GrpcTransportChannel ;
2121import com .google .api .gax .grpc .InstantiatingGrpcChannelProvider ;
22+ import com .google .api .gax .grpc .InstantiatingGrpcChannelProvider .Builder ;
2223import com .google .api .gax .rpc .TransportChannelProvider ;
2324import com .google .cloud .spanner .ErrorCode ;
2425import com .google .cloud .spanner .SpannerExceptionFactory ;
2526import com .google .common .annotations .VisibleForTesting ;
2627import io .grpc .ConnectivityState ;
2728import io .grpc .ManagedChannel ;
29+ import io .grpc .ManagedChannelBuilder ;
2830import java .io .IOException ;
2931import java .util .Map ;
32+ import java .util .Objects ;
3033import java .util .concurrent .ConcurrentHashMap ;
3134import java .util .concurrent .TimeUnit ;
3235import 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 )) {
0 commit comments