closeAsync(ClosedException closedException) {
} else {
logger.log(Level.WARNING, "Leaked session", session.leakedException);
}
+ } else {
+ String message =
+ "Leaked session. "
+ + "Call SessionOptions.Builder#setTrackStackTraceOfSessionCheckout(true) to start "
+ + "tracking the call stack trace of the thread that checked out the session.";
+ if (options.isFailOnSessionLeak()) {
+ throw new LeakedSessionException(message);
+ } else {
+ logger.log(Level.WARNING, message);
+ }
}
}
for (final PooledSession session : ImmutableList.copyOf(allSessions)) {
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java
index ad6ad2e73d7..8856081b364 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java
@@ -49,6 +49,7 @@ public class SessionPoolOptions {
private final Duration removeInactiveSessionAfter;
private final ActionOnSessionNotFound actionOnSessionNotFound;
private final ActionOnSessionLeak actionOnSessionLeak;
+ private final boolean trackStackTraceOfSessionCheckout;
private final long initialWaitForSessionTimeoutMillis;
private final boolean autoDetectDialect;
private final Duration waitForMinSessions;
@@ -65,6 +66,7 @@ private SessionPoolOptions(Builder builder) {
this.actionOnExhaustion = builder.actionOnExhaustion;
this.actionOnSessionNotFound = builder.actionOnSessionNotFound;
this.actionOnSessionLeak = builder.actionOnSessionLeak;
+ this.trackStackTraceOfSessionCheckout = builder.trackStackTraceOfSessionCheckout;
this.initialWaitForSessionTimeoutMillis = builder.initialWaitForSessionTimeoutMillis;
this.loopFrequency = builder.loopFrequency;
this.keepAliveIntervalMinutes = builder.keepAliveIntervalMinutes;
@@ -87,6 +89,8 @@ public boolean equals(Object o) {
&& Objects.equals(this.actionOnExhaustion, other.actionOnExhaustion)
&& Objects.equals(this.actionOnSessionNotFound, other.actionOnSessionNotFound)
&& Objects.equals(this.actionOnSessionLeak, other.actionOnSessionLeak)
+ && Objects.equals(
+ this.trackStackTraceOfSessionCheckout, other.trackStackTraceOfSessionCheckout)
&& Objects.equals(
this.initialWaitForSessionTimeoutMillis, other.initialWaitForSessionTimeoutMillis)
&& Objects.equals(this.loopFrequency, other.loopFrequency)
@@ -107,6 +111,7 @@ public int hashCode() {
this.actionOnExhaustion,
this.actionOnSessionNotFound,
this.actionOnSessionLeak,
+ this.trackStackTraceOfSessionCheckout,
this.initialWaitForSessionTimeoutMillis,
this.loopFrequency,
this.keepAliveIntervalMinutes,
@@ -190,6 +195,10 @@ boolean isFailOnSessionLeak() {
return actionOnSessionLeak == ActionOnSessionLeak.FAIL;
}
+ public boolean isTrackStackTraceOfSessionCheckout() {
+ return trackStackTraceOfSessionCheckout;
+ }
+
@VisibleForTesting
Duration getWaitForMinSessions() {
return waitForMinSessions;
@@ -234,6 +243,17 @@ public static class Builder {
private long initialWaitForSessionTimeoutMillis = 30_000L;
private ActionOnSessionNotFound actionOnSessionNotFound = ActionOnSessionNotFound.RETRY;
private ActionOnSessionLeak actionOnSessionLeak = ActionOnSessionLeak.WARN;
+ /**
+ * Capture the call stack of the thread that checked out a session of the pool. This will
+ * pre-create a {@link com.google.cloud.spanner.SessionPool.LeakedSessionException} already when
+ * a session is checked out. This can be disabled by users, for example if their monitoring
+ * systems log the pre-created exception. If disabled, the {@link
+ * com.google.cloud.spanner.SessionPool.LeakedSessionException} will only be created when an
+ * actual session leak is detected. The stack trace of the exception will in that case not
+ * contain the call stack of when the session was checked out.
+ */
+ private boolean trackStackTraceOfSessionCheckout = true;
+
private long loopFrequency = 10 * 1000L;
private int keepAliveIntervalMinutes = 30;
private Duration removeInactiveSessionAfter = Duration.ofMinutes(55L);
@@ -253,6 +273,7 @@ private Builder(SessionPoolOptions options) {
this.initialWaitForSessionTimeoutMillis = options.initialWaitForSessionTimeoutMillis;
this.actionOnSessionNotFound = options.actionOnSessionNotFound;
this.actionOnSessionLeak = options.actionOnSessionLeak;
+ this.trackStackTraceOfSessionCheckout = options.trackStackTraceOfSessionCheckout;
this.loopFrequency = options.loopFrequency;
this.keepAliveIntervalMinutes = options.keepAliveIntervalMinutes;
this.removeInactiveSessionAfter = options.removeInactiveSessionAfter;
@@ -393,6 +414,21 @@ Builder setFailOnSessionLeak() {
return this;
}
+ /**
+ * Sets whether the session pool should capture the call stack trace when a session is checked
+ * out of the pool. This will internally prepare a {@link
+ * com.google.cloud.spanner.SessionPool.LeakedSessionException} that will only be thrown if the
+ * session is actually leaked. This makes it easier to debug session leaks, as the stack trace
+ * of the thread that checked out the session will be available in the exception.
+ *
+ * Some monitoring tools might log these exceptions even though they are not thrown. This
+ * option can be used to suppress the creation and logging of these exceptions.
+ */
+ public Builder setTrackStackTraceOfSessionCheckout(boolean trackStackTraceOfSessionCheckout) {
+ this.trackStackTraceOfSessionCheckout = trackStackTraceOfSessionCheckout;
+ return this;
+ }
+
/**
* @deprecated This configuration value is no longer in use. The session pool does not prepare
* any sessions for read/write transactions. Instead, a transaction will automatically be
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolLeakTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolLeakTest.java
index c8f648a1dc4..7bcde30f30b 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolLeakTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolLeakTest.java
@@ -25,6 +25,15 @@
import com.google.api.gax.grpc.testing.LocalChannelProvider;
import com.google.cloud.NoCredentials;
import com.google.cloud.spanner.MockSpannerServiceImpl.SimulatedExecutionTime;
+import com.google.cloud.spanner.MockSpannerServiceImpl.StatementResult;
+import com.google.cloud.spanner.SessionPool.LeakedSessionException;
+import com.google.protobuf.ListValue;
+import com.google.protobuf.Value;
+import com.google.spanner.v1.ResultSetMetadata;
+import com.google.spanner.v1.StructType;
+import com.google.spanner.v1.StructType.Field;
+import com.google.spanner.v1.Type;
+import com.google.spanner.v1.TypeCode;
import io.grpc.Server;
import io.grpc.StatusRuntimeException;
import io.grpc.inprocess.InProcessServerBuilder;
@@ -94,6 +103,66 @@ public void tearDown() {
spanner.close();
}
+ @Test
+ public void testIgnoreLeakedSession() {
+ for (boolean trackStackTraceofSessionCheckout : new boolean[] {true, false}) {
+ SpannerOptions.Builder builder =
+ SpannerOptions.newBuilder()
+ .setProjectId("[PROJECT]")
+ .setChannelProvider(channelProvider)
+ .setCredentials(NoCredentials.getInstance());
+ builder.setSessionPoolOption(
+ SessionPoolOptions.newBuilder()
+ .setMinSessions(0)
+ .setMaxSessions(2)
+ .setIncStep(1)
+ .setFailOnSessionLeak()
+ .setTrackStackTraceOfSessionCheckout(trackStackTraceofSessionCheckout)
+ .build());
+ Spanner spanner = builder.build().getService();
+ DatabaseClient client =
+ spanner.getDatabaseClient(DatabaseId.of("[PROJECT]", "[INSTANCE]", "[DATABASE]"));
+ mockSpanner.putStatementResult(
+ StatementResult.query(
+ Statement.of("SELECT 1"),
+ com.google.spanner.v1.ResultSet.newBuilder()
+ .setMetadata(
+ ResultSetMetadata.newBuilder()
+ .setRowType(
+ StructType.newBuilder()
+ .addFields(
+ Field.newBuilder()
+ .setName("c")
+ .setType(
+ Type.newBuilder().setCode(TypeCode.INT64).build())
+ .build())
+ .build())
+ .build())
+ .addRows(
+ ListValue.newBuilder()
+ .addValues(Value.newBuilder().setStringValue("1").build())
+ .build())
+ .build()));
+
+ // Start a read-only transaction without closing it before closing the Spanner instance.
+ // This will cause a session leak.
+ ReadOnlyTransaction transaction = client.readOnlyTransaction();
+ try (ResultSet resultSet = transaction.executeQuery(Statement.of("SELECT 1"))) {
+ while (resultSet.next()) {
+ // ignore
+ }
+ }
+ LeakedSessionException exception = assertThrows(LeakedSessionException.class, spanner::close);
+ // The top of the stack trace will be "markCheckedOut" if we keep track of the point where the
+ // session was checked out, while it will be "closeAsync" if we don't. In the latter case, we
+ // get the stack trace of the method that tries to close the Spanner instance, while in the
+ // former the stack trace will contain the method that checked out the session.
+ assertEquals(
+ trackStackTraceofSessionCheckout ? "markCheckedOut" : "closeAsync",
+ exception.getStackTrace()[0].getMethodName());
+ }
+ }
+
@Test
public void testReadWriteTransactionExceptionOnCreateSession() {
readWriteTransactionTest(
From 6927e06aa5cb60b73515a34d75eac57ba6c36c50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?=
Date: Sat, 8 Apr 2023 06:55:11 +0200
Subject: [PATCH 6/9] test: fix NullPointerException in mock server (#2365)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* test: fix NullPointerException in mock server
Fix a potential NullPointerException in the mock server when a statement uses a
parameter of type ARRAY with a null element in the array.
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot
---
.../java/com/google/cloud/spanner/DatabaseClientImplTest.java | 3 ++-
.../java/com/google/cloud/spanner/MockSpannerServiceImpl.java | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java
index 9885e4f83d5..0b88edc7f69 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseClientImplTest.java
@@ -84,6 +84,7 @@
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
@@ -2950,7 +2951,7 @@ public void testStatementWithBytesArrayParameter() {
Statement.newBuilder("select id from test where b=@p1")
.bind("p1")
.toBytesArray(
- ImmutableList.of(ByteArray.copyFrom("test1"), ByteArray.copyFrom("test2")))
+ Arrays.asList(ByteArray.copyFrom("test1"), null, ByteArray.copyFrom("test2")))
.build();
mockSpanner.putStatementResult(StatementResult.query(statement, SELECT1_RESULTSET));
DatabaseClient client =
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
index 567279c511c..66695676112 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
@@ -1367,7 +1367,8 @@ private Statement buildStatement(
(Iterable)
GrpcStruct.decodeArrayValue(
com.google.cloud.spanner.Type.bytes(), value.getListValue()),
- LazyByteArray::getByteArray));
+ lazyByteArray ->
+ lazyByteArray == null ? null : lazyByteArray.getByteArray()));
break;
case DATE:
builder
From 1c334e0d13cf2618cba94a4795595f10c7ab1328 Mon Sep 17 00:00:00 2001
From: Gaurav Purohit
Date: Tue, 11 Apr 2023 16:12:13 +0530
Subject: [PATCH 7/9] test: Disabling the databoost Integration tests till GA
(#2374)
---
.../java/com/google/cloud/spanner/it/ITBatchReadTest.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java
index 89a4a76e862..9a50a5ca7be 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java
@@ -241,6 +241,8 @@ public void readUsingIndex() {
@Test
public void dataBoostRead() {
+ // TODO: Remove the following check during GA
+ assumeFalse("DataBoost feature is not yet generally available", true);
assumeFalse("Emulator does not support data boost read", isUsingEmulator());
BitSet seenRows = new BitSet(numRows);
@@ -295,6 +297,8 @@ private PartitionOptions getRandomPartitionOptions() {
@Test
public void dataBoostQuery() {
+ // TODO: Remove the following check during GA
+ assumeFalse("DataBoost feature is not yet generally available", true);
assumeFalse("Emulator does not support data boost query", isUsingEmulator());
BitSet seenRows = new BitSet(numRows);
TimestampBound bound = getRandomBound();
From 141a72e2693ad5cab7d4c41f870d4ab1503f92e8 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 11 Apr 2023 12:44:13 +0100
Subject: [PATCH 8/9] chore(deps): update dependency
com.google.cloud:libraries-bom to v26.12.0 (#2364)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [com.google.cloud:libraries-bom](https://cloud.google.com/java/docs/bom) ([source](https://togithub.com/googleapis/java-cloud-bom)) | `26.11.0` -> `26.12.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Release Notes
googleapis/java-cloud-bom
### [`v26.12.0`](https://togithub.com/googleapis/java-cloud-bom/blob/HEAD/CHANGELOG.md#26120-httpsgithubcomgoogleapisjava-cloud-bomcomparev26110v26120-2023-04-04)
[Compare Source](https://togithub.com/googleapis/java-cloud-bom/compare/v26.11.0...v26.12.0)
##### Dependencies
- update dependency com.google.cloud:first-party-dependencies to v3.6.0 ([#5893](https://togithub.com/googleapis/java-cloud-bom/issues/5893)) ([1b6e4d0](https://togithub.com/googleapis/java-cloud-bom/commit/1b6e4d08838827942d1dd3cccc6e6b715e7aef1e))
- update dependency com.google.cloud:gapic-libraries-bom to v1.8.0 ([#5902](https://togithub.com/googleapis/java-cloud-bom/issues/5902)) ([2a292e0](https://togithub.com/googleapis/java-cloud-bom/commit/2a292e0d17e773d6a32b51f0c791bf50198ae87a))
- update dependency com.google.cloud:google-cloud-bigquery to v2.24.3 ([#5890](https://togithub.com/googleapis/java-cloud-bom/issues/5890)) ([278f74a](https://togithub.com/googleapis/java-cloud-bom/commit/278f74aa5139e5304556c2dfdb81e96a75066938))
- update dependency com.google.cloud:google-cloud-bigquery to v2.24.4 ([#5901](https://togithub.com/googleapis/java-cloud-bom/issues/5901)) ([14687f6](https://togithub.com/googleapis/java-cloud-bom/commit/14687f6199509bdede2eaee41fea1942bb40b849))
- update dependency com.google.cloud:google-cloud-bigquerystorage-bom to v2.34.2 ([#5900](https://togithub.com/googleapis/java-cloud-bom/issues/5900)) ([34de054](https://togithub.com/googleapis/java-cloud-bom/commit/34de05450df961a00e302fd6276e2fdc8f94f835))
- update dependency com.google.cloud:google-cloud-bigtable-bom to v2.20.2 ([#5904](https://togithub.com/googleapis/java-cloud-bom/issues/5904)) ([fe66de5](https://togithub.com/googleapis/java-cloud-bom/commit/fe66de5dc2c50fb45710543fa1b417cc9a0cd48e))
- update dependency com.google.cloud:google-cloud-bigtable-bom to v2.20.3 ([#5905](https://togithub.com/googleapis/java-cloud-bom/issues/5905)) ([970fdea](https://togithub.com/googleapis/java-cloud-bom/commit/970fdea74455b004cf23dbeb2d8a072616ef9fd3))
- update dependency com.google.cloud:google-cloud-datastore-bom to v2.14.2 ([#5899](https://togithub.com/googleapis/java-cloud-bom/issues/5899)) ([7dd6048](https://togithub.com/googleapis/java-cloud-bom/commit/7dd6048b2f888ab2d39df54096f7848c5bd5976a))
- update dependency com.google.cloud:google-cloud-firestore-bom to v3.9.3 ([#5897](https://togithub.com/googleapis/java-cloud-bom/issues/5897)) ([046528f](https://togithub.com/googleapis/java-cloud-bom/commit/046528f66480fa84d2095098f8a4f0dee0f81e41))
- update dependency com.google.cloud:google-cloud-logging-bom to v3.14.7 ([#5894](https://togithub.com/googleapis/java-cloud-bom/issues/5894)) ([f6820a1](https://togithub.com/googleapis/java-cloud-bom/commit/f6820a186666416a8e004845884d3b168f9d6609))
- update dependency com.google.cloud:google-cloud-logging-logback to v0.130.9-alpha ([#5895](https://togithub.com/googleapis/java-cloud-bom/issues/5895)) ([1af16aa](https://togithub.com/googleapis/java-cloud-bom/commit/1af16aa657c6a5ecfd2fc118c6c806b8937dd27e))
- update dependency com.google.cloud:google-cloud-nio to v0.126.11 ([#5910](https://togithub.com/googleapis/java-cloud-bom/issues/5910)) ([85f14a3](https://togithub.com/googleapis/java-cloud-bom/commit/85f14a3ec6ff117413d5fd8e1a056efb73a42864))
- update dependency com.google.cloud:google-cloud-pubsub-bom to v1.123.8 ([#5909](https://togithub.com/googleapis/java-cloud-bom/issues/5909)) ([bb4a0c6](https://togithub.com/googleapis/java-cloud-bom/commit/bb4a0c62b68dd8063ece2ce8b06a0958f001d59e))
- update dependency com.google.cloud:google-cloud-pubsublite-bom to v1.12.2 ([#5911](https://togithub.com/googleapis/java-cloud-bom/issues/5911)) ([d168583](https://togithub.com/googleapis/java-cloud-bom/commit/d168583255a4978ae06ccc8e3ce0321b21ce54f1))
- update dependency com.google.cloud:google-cloud-spanner-bom to v6.38.2 ([#5896](https://togithub.com/googleapis/java-cloud-bom/issues/5896)) ([5b82b21](https://togithub.com/googleapis/java-cloud-bom/commit/5b82b218bf39181c33d65580e02b583fdbb52e93))
- update dependency com.google.cloud:google-cloud-spanner-jdbc to v2.9.11 ([#5898](https://togithub.com/googleapis/java-cloud-bom/issues/5898)) ([e6061a6](https://togithub.com/googleapis/java-cloud-bom/commit/e6061a6f4f13c2d5c2dec4266c3f73e6b72c037a))
- update dependency com.google.cloud:google-cloud-storage-bom to v2.21.0 ([#5908](https://togithub.com/googleapis/java-cloud-bom/issues/5908)) ([a3f8081](https://togithub.com/googleapis/java-cloud-bom/commit/a3f80819ed3fbd385129a9b184b8c79b936e1136))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
â™» **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/java-spanner).
---
README.md | 2 +-
samples/native-image/pom.xml | 2 +-
samples/snippets/pom.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index fdbf5abcab5..1e1173092d8 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file:
com.google.cloud
libraries-bom
- 26.11.0
+ 26.12.0
pom
import
diff --git a/samples/native-image/pom.xml b/samples/native-image/pom.xml
index 34f084c80de..335822bda36 100644
--- a/samples/native-image/pom.xml
+++ b/samples/native-image/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
libraries-bom
- 26.11.0
+ 26.12.0
pom
import
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 03a79157934..d71f010f086 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -33,7 +33,7 @@
com.google.cloud
libraries-bom
- 26.11.0
+ 26.12.0
pom
import
From afb1ef1fbe63ab1003af8ea6a964d409dfcc673c Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Tue, 11 Apr 2023 12:44:12 +0000
Subject: [PATCH 9/9] chore(main): release 6.39.0 (#2368)
:robot: I have created a release *beep* *boop*
---
## [6.39.0](https://togithub.com/googleapis/java-spanner/compare/v6.38.2...v6.39.0) (2023-04-11)
### Features
* Capture stack trace for session checkout is now optional ([#2350](https://togithub.com/googleapis/java-spanner/issues/2350)) ([6b6427a](https://togithub.com/googleapis/java-spanner/commit/6b6427a25af25fde944dfc1dd4bf6a6463682caf))
---
This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please).
---
CHANGELOG.md | 7 +++++++
google-cloud-spanner-bom/pom.xml | 20 +++++++++----------
google-cloud-spanner-executor/pom.xml | 4 ++--
google-cloud-spanner/pom.xml | 4 ++--
.../pom.xml | 4 ++--
.../pom.xml | 4 ++--
grpc-google-cloud-spanner-v1/pom.xml | 4 ++--
pom.xml | 16 +++++++--------
.../pom.xml | 4 ++--
.../pom.xml | 4 ++--
proto-google-cloud-spanner-v1/pom.xml | 4 ++--
samples/snapshot/pom.xml | 2 +-
versions.txt | 16 +++++++--------
13 files changed, 50 insertions(+), 43 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0d1004e590d..45d5540ad69 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [6.39.0](https://github.com/googleapis/java-spanner/compare/v6.38.2...v6.39.0) (2023-04-11)
+
+
+### Features
+
+* Capture stack trace for session checkout is now optional ([#2350](https://github.com/googleapis/java-spanner/issues/2350)) ([6b6427a](https://github.com/googleapis/java-spanner/commit/6b6427a25af25fde944dfc1dd4bf6a6463682caf))
+
## [6.38.2](https://github.com/googleapis/java-spanner/compare/v6.38.1...v6.38.2) (2023-04-01)
diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml
index c0e6b497512..50a4cb5b73e 100644
--- a/google-cloud-spanner-bom/pom.xml
+++ b/google-cloud-spanner-bom/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-spanner-bom
- 6.38.3-SNAPSHOT
+ 6.39.0
pom
com.google.cloud
@@ -53,48 +53,48 @@
com.google.cloud
google-cloud-spanner
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.cloud
google-cloud-spanner-executor
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.cloud
google-cloud-spanner
test-jar
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.api.grpc
grpc-google-cloud-spanner-v1
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.api.grpc
grpc-google-cloud-spanner-admin-instance-v1
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.api.grpc
grpc-google-cloud-spanner-admin-database-v1
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.api.grpc
proto-google-cloud-spanner-admin-instance-v1
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.api.grpc
proto-google-cloud-spanner-v1
- 6.38.3-SNAPSHOT
+ 6.39.0
com.google.api.grpc
proto-google-cloud-spanner-admin-database-v1
- 6.38.3-SNAPSHOT
+ 6.39.0