Skip to content

Commit 76db06c

Browse files
committed
fix(spanner): lazily initialize cloudpath fallback pool
1 parent 41d94da commit 76db06c

2 files changed

Lines changed: 39 additions & 9 deletions

File tree

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -705,18 +705,19 @@ public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
705705
ManagedChannelBuilder<?> fallbackBuilder = cloudPathBuilder;
706706
if (options.isGrpcGcpExtensionEnabled()) {
707707
String jsonApiConfig = parseGrpcGcpApiConfig();
708-
GcpManagedChannelOptions gcpOptions = grpcGcpOptionsWithMetricsAndDcp(options);
709-
if (gcpOptions == null) {
710-
gcpOptions = GcpManagedChannelOptions.newBuilder().build();
711-
}
708+
GcpManagedChannelOptions primaryGcpOptions = grpcGcpOptionsWithMetricsAndDcp(options);
709+
GcpManagedChannelOptions fallbackGcpOptions =
710+
GcpManagedChannelOptions.newBuilder(primaryGcpOptions)
711+
.withChannelPoolOptions(getGrpcGcpLazyFallbackChannelPoolOptions(options))
712+
.build();
712713
primaryBuilder =
713714
GcpManagedChannelBuilder.forDelegateBuilder(builder)
714715
.withApiConfigJsonString(jsonApiConfig)
715-
.withOptions(gcpOptions);
716+
.withOptions(primaryGcpOptions);
716717
fallbackBuilder =
717718
GcpManagedChannelBuilder.forDelegateBuilder(cloudPathBuilder)
718719
.withApiConfigJsonString(jsonApiConfig)
719-
.withOptions(gcpOptions);
720+
.withOptions(fallbackGcpOptions);
720721
}
721722

722723
GcpFallbackOpenTelemetry fallbackTelemetry =
@@ -846,6 +847,14 @@ static GcpChannelPoolOptions getGrpcGcpChannelPoolOptions(SpannerOptions options
846847
.build();
847848
}
848849

850+
@VisibleForTesting
851+
static GcpChannelPoolOptions getGrpcGcpLazyFallbackChannelPoolOptions(SpannerOptions options) {
852+
return GcpChannelPoolOptions.newBuilder(getGrpcGcpChannelPoolOptions(options))
853+
.setMinSize(0)
854+
.setInitSize(0)
855+
.build();
856+
}
857+
849858
@VisibleForTesting
850859
static GcpChannelPoolOptions getGrpcGcpEndpointChannelPoolOptions(SpannerOptions options) {
851860
GcpChannelPoolOptions channelPoolOptions = options.getGcpChannelPoolOptions();

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,27 @@ public void testGrpcGcpOptionsIncludeStaticChannelPoolSettingsWithoutDcp() throw
12641264
assertEquals(Duration.ZERO, grpcGcpOptions.getChannelPoolOptions().getScaleDownInterval());
12651265
}
12661266

1267+
@Test
1268+
public void testGrpcGcpLazyFallbackChannelPoolOptionsStartWithoutChannels() {
1269+
SpannerOptions options =
1270+
SpannerOptions.newBuilder()
1271+
.setProjectId("[PROJECT]")
1272+
.enableGrpcGcpExtension()
1273+
.disableDynamicChannelPool()
1274+
.setNumChannels(8)
1275+
.build();
1276+
1277+
GcpChannelPoolOptions poolOptions =
1278+
GapicSpannerRpc.getGrpcGcpLazyFallbackChannelPoolOptions(options);
1279+
1280+
assertEquals(8, poolOptions.getMaxSize());
1281+
assertEquals(0, poolOptions.getMinSize());
1282+
assertEquals(0, poolOptions.getInitSize());
1283+
assertEquals(0, poolOptions.getMinRpcPerChannel());
1284+
assertEquals(0, poolOptions.getMaxRpcPerChannel());
1285+
assertEquals(Duration.ZERO, poolOptions.getScaleDownInterval());
1286+
}
1287+
12671288
@Test
12681289
public void testGrpcGcpOptionsRetainDynamicChannelPoolSettingsWithDcp() throws Exception {
12691290
Duration affinityKeyLifetime = Duration.ofMinutes(10);
@@ -1434,7 +1455,7 @@ private SpannerOptions createSpannerOptions() {
14341455
}
14351456

14361457
@Test
1437-
public void testDirectPathFallbackCreatesOneGrpcGcpLayerPerPath() {
1458+
public void testDirectPathFallbackCreatesLazyCloudPathGrpcGcpPool() {
14381459
SpannerOptions.useEnvironment(new SpannerOptions.SpannerEnvironment() {});
14391460
GapicSpannerRpc rpc = null;
14401461
try {
@@ -1445,8 +1466,8 @@ public void testDirectPathFallbackCreatesOneGrpcGcpLayerPerPath() {
14451466
GrpcGcpObjectCounts before = countGrpcGcpObjectsFromChannelz();
14461467
rpc = new GapicSpannerRpc(options);
14471468
GrpcGcpObjectCounts counts = countGrpcGcpObjectsFromChannelz().minus(before);
1448-
assertEquals(counts.debugString(), 6, counts.gcpManagedChannels);
1449-
assertEquals(counts.debugString(), 48, counts.channelRefs);
1469+
assertEquals(counts.debugString(), 3, counts.gcpManagedChannels);
1470+
assertEquals(counts.debugString(), 24, counts.channelRefs);
14501471
} finally {
14511472
if (rpc != null) {
14521473
rpc.shutdown();

0 commit comments

Comments
 (0)