From b6b483904ec3a7bb9b82cfbf70277b38c207926a Mon Sep 17 00:00:00 2001 From: Mike Eltsufin Date: Fri, 13 Sep 2019 12:09:29 -0400 Subject: [PATCH] Expose Spanner failIfPoolExhausted property Related to: #1887. --- docs/src/main/asciidoc/spanner.adoc | 1 + .../spanner/GcpSpannerAutoConfiguration.java | 8 ++++++++ .../autoconfigure/spanner/GcpSpannerProperties.java | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/docs/src/main/asciidoc/spanner.adoc b/docs/src/main/asciidoc/spanner.adoc index cde925d6cf..2d4eecf3a4 100644 --- a/docs/src/main/asciidoc/spanner.adoc +++ b/docs/src/main/asciidoc/spanner.adoc @@ -87,6 +87,7 @@ The schema for the tables will be "ON DELETE NO ACTION" if `false`. | No | `true | `spring.cloud.gcp.spanner.maxIdleSessions` | Maximum number of idle sessions session pool will maintain | No | 0 - Determined by Cloud Spanner client library | `spring.cloud.gcp.spanner.writeSessionsFraction` | Fraction of sessions to be kept prepared for write transactions | No | 0.2 - Determined by Cloud Spanner client library | `spring.cloud.gcp.spanner.keepAliveIntervalMinutes` | How long to keep idle sessions alive | No | 30 - Determined by Cloud Spanner client library +| `spring.cloud.gcp.spanner.failIfPoolExhausted` | If all sessions are in use, fail the request by throwing an exception. Otherwise, by default, block until a session becomes available. | No | `false` |=== ==== Repository settings diff --git a/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerAutoConfiguration.java b/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerAutoConfiguration.java index 1f9f9dc1c3..cb6def59a2 100644 --- a/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerAutoConfiguration.java +++ b/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerAutoConfiguration.java @@ -95,6 +95,8 @@ static class CoreSpannerAutoConfiguration { private final boolean createInterleavedTableDdlOnDeleteCascade; + private final boolean failIfPoolExhausted; + CoreSpannerAutoConfiguration(GcpSpannerProperties gcpSpannerProperties, GcpProjectIdProvider projectIdProvider, CredentialsProvider credentialsProvider) throws IOException { @@ -116,6 +118,7 @@ static class CoreSpannerAutoConfiguration { .getKeepAliveIntervalMinutes(); this.createInterleavedTableDdlOnDeleteCascade = gcpSpannerProperties .isCreateInterleavedTableDdlOnDeleteCascade(); + this.failIfPoolExhausted = gcpSpannerProperties.isFailIfPoolExhausted(); } @Bean @@ -158,6 +161,11 @@ public SessionPoolOptions sessionPoolOptions() { if (this.keepAliveIntervalMinutes >= 0) { builder.setKeepAliveIntervalMinutes(this.keepAliveIntervalMinutes); } + + if (this.failIfPoolExhausted) { + builder.setFailIfPoolExhausted(); + } + return builder.build(); } diff --git a/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerProperties.java b/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerProperties.java index 0ef78c6309..c961119f6d 100644 --- a/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerProperties.java +++ b/spring-cloud-gcp-autoconfigure/src/main/java/org/springframework/cloud/gcp/autoconfigure/spanner/GcpSpannerProperties.java @@ -66,6 +66,10 @@ public class GcpSpannerProperties implements CredentialsSupplier { // Default value is negative to indicate to use Cloud Spanner default number. private int keepAliveIntervalMinutes = -1; + // When {@code true}, if all sessions are in use, fail the request by throwing an exception. + // Otherwise, by default, block until a session becomes available. + private boolean failIfPoolExhausted = false; + public Credentials getCredentials() { return this.credentials; } @@ -159,4 +163,12 @@ public void setCreateInterleavedTableDdlOnDeleteCascade( this.createInterleavedTableDdlOnDeleteCascade = createInterleavedTableDdlOnDeleteCascade; } + + public boolean isFailIfPoolExhausted() { + return failIfPoolExhausted; + } + + public void setFailIfPoolExhausted(boolean failIfPoolExhausted) { + this.failIfPoolExhausted = failIfPoolExhausted; + } }