Skip to content

Commit 0f6018c

Browse files
committed
fix getState()
1 parent d436d70 commit 0f6018c

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717
package com.google.cloud.spanner.spi.v1;
1818

1919
import com.google.api.core.InternalApi;
20-
import com.google.api.gax.grpc.GrpcTransportChannel;
2120
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
2221
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.Builder;
23-
import com.google.api.gax.rpc.TransportChannelProvider;
2422
import com.google.cloud.spanner.ErrorCode;
2523
import com.google.cloud.spanner.SpannerExceptionFactory;
2624
import com.google.common.annotations.VisibleForTesting;
@@ -92,7 +90,8 @@ public ChannelEndpoint get(String address) {
9290
try {
9391
// Create a new provider with the same config but different endpoint.
9492
// This is thread-safe as withEndpoint() returns a new provider instance.
95-
TransportChannelProvider newProvider = createProviderWithAuthorityOverride(addr);
93+
InstantiatingGrpcChannelProvider newProvider =
94+
createProviderWithAuthorityOverride(addr);
9695
GrpcChannelEndpoint endpoint = new GrpcChannelEndpoint(addr, newProvider);
9796
logger.log(Level.INFO, "Location-aware endpoint created for address: {0}", addr);
9897
return endpoint;
@@ -111,7 +110,7 @@ public ChannelEndpoint getIfPresent(String address) {
111110
return servers.get(address);
112111
}
113112

114-
private TransportChannelProvider createProviderWithAuthorityOverride(String address) {
113+
private InstantiatingGrpcChannelProvider createProviderWithAuthorityOverride(String address) {
115114
InstantiatingGrpcChannelProvider endpointProvider =
116115
(InstantiatingGrpcChannelProvider) baseProvider.withEndpoint(address);
117116
if (Objects.equals(defaultAuthority, address)) {
@@ -191,15 +190,19 @@ static class GrpcChannelEndpoint implements ChannelEndpoint {
191190
* @param provider the channel provider (must be a gRPC provider)
192191
* @throws IOException if the channel cannot be created
193192
*/
194-
GrpcChannelEndpoint(String address, TransportChannelProvider provider) throws IOException {
193+
GrpcChannelEndpoint(String address, InstantiatingGrpcChannelProvider provider)
194+
throws IOException {
195195
this.address = address;
196-
TransportChannelProvider readyProvider = provider;
196+
// Build a raw ManagedChannel directly instead of going through getTransportChannel(),
197+
// which wraps the channel in a ChannelPool that does not support getState().
198+
// Location-aware routing needs getState() to check channel connectivity.
199+
InstantiatingGrpcChannelProvider readyProvider = provider;
197200
if (provider.needsHeaders()) {
198-
readyProvider = provider.withHeaders(java.util.Collections.emptyMap());
201+
readyProvider =
202+
(InstantiatingGrpcChannelProvider)
203+
provider.withHeaders(java.util.Collections.emptyMap());
199204
}
200-
GrpcTransportChannel transportChannel =
201-
(GrpcTransportChannel) readyProvider.getTransportChannel();
202-
this.channel = (ManagedChannel) transportChannel.getChannel();
205+
this.channel = readyProvider.createDecoratedChannelBuilder().build();
203206
}
204207

205208
/**

0 commit comments

Comments
 (0)