From 22fa8cc8b6f26e741b60d7750532dd082c2826bf Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Sat, 27 Sep 2025 08:05:43 +0200 Subject: [PATCH 01/34] chore(main): release 6.101.2-SNAPSHOT (#4094) * chore(main): release 6.101.2-SNAPSHOT * chore: generate libraries at Fri Sep 26 17:01:21 UTC 2025 --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cloud-java-bot --- README.md | 6 +++--- benchmarks/pom.xml | 2 +- google-cloud-spanner-bom/pom.xml | 18 ++++++++--------- google-cloud-spanner-executor/pom.xml | 4 ++-- google-cloud-spanner/pom.xml | 4 ++-- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- grpc-google-cloud-spanner-executor-v1/pom.xml | 4 ++-- grpc-google-cloud-spanner-v1/pom.xml | 4 ++-- pom.xml | 20 +++++++++---------- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- proto-google-cloud-spanner-v1/pom.xml | 4 ++-- samples/snapshot/pom.xml | 2 +- versions.txt | 20 +++++++++---------- 16 files changed, 54 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 73f923590a..c0eb12946e 100644 --- a/README.md +++ b/README.md @@ -56,13 +56,13 @@ implementation 'com.google.cloud:google-cloud-spanner' If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-spanner:6.101.0' +implementation 'com.google.cloud:google-cloud-spanner:6.101.1' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.101.0" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.101.1" ``` ## Authentication @@ -731,7 +731,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-spanner/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-spanner.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-spanner/6.101.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-spanner/6.101.1 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 47598f1c64..67cfbf5ba5 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -24,7 +24,7 @@ com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 33e4677274..1815eca131 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.101.1 + 6.101.2-SNAPSHOT pom com.google.cloud @@ -53,43 +53,43 @@ com.google.cloud google-cloud-spanner - 6.101.1 + 6.101.2-SNAPSHOT com.google.cloud google-cloud-spanner test-jar - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index edabbdac62..b359836c55 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -5,14 +5,14 @@ 4.0.0 com.google.cloud google-cloud-spanner-executor - 6.101.1 + 6.101.2-SNAPSHOT jar Google Cloud Spanner Executor com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 9bb8709315..6cf9bcb8bf 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner - 6.101.1 + 6.101.2-SNAPSHOT jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT google-cloud-spanner diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml index a89656fcfc..7cc175b603 100644 --- a/grpc-google-cloud-spanner-admin-database-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.101.1 + 6.101.2-SNAPSHOT grpc-google-cloud-spanner-admin-database-v1 GRPC library for grpc-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index c5e56e818d..fd5e3c4499 100644 --- a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.101.1 + 6.101.2-SNAPSHOT grpc-google-cloud-spanner-admin-instance-v1 GRPC library for grpc-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/grpc-google-cloud-spanner-executor-v1/pom.xml b/grpc-google-cloud-spanner-executor-v1/pom.xml index f143922638..3b4172bb48 100644 --- a/grpc-google-cloud-spanner-executor-v1/pom.xml +++ b/grpc-google-cloud-spanner-executor-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.101.1 + 6.101.2-SNAPSHOT grpc-google-cloud-spanner-executor-v1 GRPC library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index 0e2812e71f..3d048e2c36 100644 --- a/grpc-google-cloud-spanner-v1/pom.xml +++ b/grpc-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.101.1 + 6.101.2-SNAPSHOT grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 3ed2cc20b5..091117e06f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 6.101.1 + 6.101.2-SNAPSHOT Google Cloud Spanner Parent https://github.com/googleapis/java-spanner @@ -61,47 +61,47 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.101.1 + 6.101.2-SNAPSHOT com.google.cloud google-cloud-spanner - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index af692c6a4d..4529c9b4b4 100644 --- a/proto-google-cloud-spanner-admin-database-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.101.1 + 6.101.2-SNAPSHOT proto-google-cloud-spanner-admin-database-v1 PROTO library for proto-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index 2b129d2faf..2f0cceeae3 100644 --- a/proto-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.101.1 + 6.101.2-SNAPSHOT proto-google-cloud-spanner-admin-instance-v1 PROTO library for proto-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/proto-google-cloud-spanner-executor-v1/pom.xml b/proto-google-cloud-spanner-executor-v1/pom.xml index 557343a2e3..ceb7bc84ea 100644 --- a/proto-google-cloud-spanner-executor-v1/pom.xml +++ b/proto-google-cloud-spanner-executor-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.101.1 + 6.101.2-SNAPSHOT proto-google-cloud-spanner-executor-v1 Proto library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index 4acd5bf612..9373296dac 100644 --- a/proto-google-cloud-spanner-v1/pom.xml +++ b/proto-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.101.1 + 6.101.2-SNAPSHOT proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index b8d534a4c8..b8ffa1d9cb 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -32,7 +32,7 @@ com.google.cloud google-cloud-spanner - 6.101.1 + 6.101.2-SNAPSHOT diff --git a/versions.txt b/versions.txt index ee56d9a157..08f012dbea 100644 --- a/versions.txt +++ b/versions.txt @@ -1,13 +1,13 @@ # Format: # module:released-version:current-version -proto-google-cloud-spanner-admin-instance-v1:6.101.1:6.101.1 -proto-google-cloud-spanner-v1:6.101.1:6.101.1 -proto-google-cloud-spanner-admin-database-v1:6.101.1:6.101.1 -grpc-google-cloud-spanner-v1:6.101.1:6.101.1 -grpc-google-cloud-spanner-admin-instance-v1:6.101.1:6.101.1 -grpc-google-cloud-spanner-admin-database-v1:6.101.1:6.101.1 -google-cloud-spanner:6.101.1:6.101.1 -google-cloud-spanner-executor:6.101.1:6.101.1 -proto-google-cloud-spanner-executor-v1:6.101.1:6.101.1 -grpc-google-cloud-spanner-executor-v1:6.101.1:6.101.1 +proto-google-cloud-spanner-admin-instance-v1:6.101.1:6.101.2-SNAPSHOT +proto-google-cloud-spanner-v1:6.101.1:6.101.2-SNAPSHOT +proto-google-cloud-spanner-admin-database-v1:6.101.1:6.101.2-SNAPSHOT +grpc-google-cloud-spanner-v1:6.101.1:6.101.2-SNAPSHOT +grpc-google-cloud-spanner-admin-instance-v1:6.101.1:6.101.2-SNAPSHOT +grpc-google-cloud-spanner-admin-database-v1:6.101.1:6.101.2-SNAPSHOT +google-cloud-spanner:6.101.1:6.101.2-SNAPSHOT +google-cloud-spanner-executor:6.101.1:6.101.2-SNAPSHOT +proto-google-cloud-spanner-executor-v1:6.101.1:6.101.2-SNAPSHOT +grpc-google-cloud-spanner-executor-v1:6.101.1:6.101.2-SNAPSHOT From 0b306732fbb58afa56fbfff3b580c53a4193d4f6 Mon Sep 17 00:00:00 2001 From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com> Date: Sat, 27 Sep 2025 02:06:40 -0400 Subject: [PATCH 02/34] chore: Update generation configuration at Sat Sep 27 02:26:40 UTC 2025 (#4095) * chore: Update generation configuration at Sat Sep 27 02:26:40 UTC 2025 * chore: generate libraries at Sat Sep 27 02:27:10 UTC 2025 --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index f1a9a7abab..ceefc9ceee 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,5 +1,5 @@ gapic_generator_version: 2.62.2 -googleapis_commitish: 329ace5e3712a2e37d6159d4dcd998d8c73f261e +googleapis_commitish: 31b413bc4feb03f6849c718048c2b9998561b5fa libraries_bom_version: 26.68.0 libraries: - api_shortname: spanner From e23134a2f864e8abd2890ac3a81ff6b668afbe63 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 07:12:18 +0100 Subject: [PATCH 03/34] deps: update actions/setup-java action to v5 (#4071) --- ...tegration-tests-against-emulator-with-regular-session.yaml | 4 ++-- .github/workflows/integration-tests-against-emulator.yaml | 4 ++-- .github/workflows/unmanaged_dependency_check.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml b/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml index 06e7e416d9..3d64f41909 100644 --- a/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml +++ b/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml @@ -21,13 +21,13 @@ jobs: with: maven-version: 3.8.1 # Build with JDK 11 and run tests with JDK 8 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: java-version: 11 distribution: temurin - name: Compiling main library run: .kokoro/build.sh - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: java-version: 8 distribution: temurin diff --git a/.github/workflows/integration-tests-against-emulator.yaml b/.github/workflows/integration-tests-against-emulator.yaml index f4ac97a8fe..a9f5e46ca3 100644 --- a/.github/workflows/integration-tests-against-emulator.yaml +++ b/.github/workflows/integration-tests-against-emulator.yaml @@ -21,13 +21,13 @@ jobs: with: maven-version: 3.8.1 # Build with JDK 11 and run tests with JDK 8 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: java-version: 11 distribution: temurin - name: Compiling main library run: .kokoro/build.sh - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: java-version: 8 distribution: temurin diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index e646d4e2c2..11dc247ab0 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: distribution: temurin java-version: 11 From feb2217ab90c93c5ccf947ce7736e65231af66ee Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 08:39:28 +0100 Subject: [PATCH 04/34] build(deps): update dependency org.codehaus.mojo:build-helper-maven-plugin to v3.6.1 (#4032) Co-authored-by: rahul2393 --- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index e24840bbb8..1f0d870870 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -116,7 +116,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.6.0 + 3.6.1 add-snippets-source diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index b8ffa1d9cb..f35a4f37f4 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -115,7 +115,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.6.0 + 3.6.1 add-snippets-source From 71585425fbb3ece217bd3a4192990b0070a713be Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 08:48:06 +0100 Subject: [PATCH 05/34] build(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.5.1 (#4033) --- benchmarks/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 67cfbf5ba5..49f456ad9c 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -133,7 +133,7 @@ org.codehaus.mojo exec-maven-plugin - 3.5.0 + 3.5.1 com.google.cloud.spanner.benchmark.LatencyBenchmark false From 05f3025f688dd2038f17a4bc34fabc20f9409eac Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 09:38:41 +0100 Subject: [PATCH 06/34] build(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.14.1 (#4058) --- google-cloud-spanner-bom/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 1815eca131..9996e9c964 100644 --- a/google-cloud-spanner-bom/pom.xml +++ b/google-cloud-spanner-bom/pom.xml @@ -100,7 +100,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.0 + 3.14.1 1.8 1.8 diff --git a/pom.xml b/pom.xml index 091117e06f..0416378525 100644 --- a/pom.xml +++ b/pom.xml @@ -153,7 +153,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.0 + 3.14.1 1.8 1.8 From 056ae2bb0cd8f1b8e708b23c003e076820a2eebe Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 10:00:39 +0100 Subject: [PATCH 07/34] build(deps): update dependency org.apache.maven.plugins:maven-failsafe-plugin to v3.5.4 (#4059) --- google-cloud-spanner-executor/pom.xml | 2 +- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- samples/snippets/pom.xml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index b359836c55..658239ede6 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -267,7 +267,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.3 + 3.5.4 diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 1f0d870870..d13e81bafc 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -145,7 +145,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.3 + 3.5.4 10 false diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index f35a4f37f4..659f74b675 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -144,7 +144,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.3 + 3.5.4 10 false diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 25be82edd8..22c6400079 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -126,7 +126,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.3 + 3.5.4 10 false @@ -155,7 +155,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.3 + 3.5.4 10 false From fed2dfc74795ad4dba06c510d4ca31cd7c01a4e1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 13:16:18 +0100 Subject: [PATCH 08/34] build(deps): update dependency org.apache.maven.surefire:surefire-junit4 to v3.5.4 (#4060) --- google-cloud-spanner-executor/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index 658239ede6..ef98adadfb 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -202,7 +202,7 @@ org.apache.maven.surefire surefire-junit4 - 3.5.3 + 3.5.4 test From 6237ee40a462442b89f6f455f12bdd998528a6bf Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 15:04:21 +0100 Subject: [PATCH 09/34] test(deps): update dependency com.google.truth:truth to v1.4.5 (#4061) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.truth:truth](https://redirect.github.com/google/truth) | `1.4.4` -> `1.4.5` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.google.truth:truth/1.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.google.truth:truth/1.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.google.truth:truth/1.4.4/1.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.google.truth:truth/1.4.4/1.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
google/truth (com.google.truth:truth) ### [`v1.4.5`](https://redirect.github.com/google/truth/releases/tag/v1.4.5): 1.4.5 - Changed assertions like `assertThat(nullMap).isEmpty()` to fail with a useful failure message instead of throwing `NullPointerException` (and similarly for other "bogus" values, such as negative sizes). ([`da5d6e9`](https://redirect.github.com/google/truth/commit/da5d6e96f)) - Made Kotlin's `isInstanceOf(Int::class.java)` (and Java's `isInstanceOf(int.class)`) a valid way to check for `Int`/`Integer` instances. ([`974ef19`](https://redirect.github.com/google/truth/commit/974ef195b)) - Improved `isWithin` to pretty-print numbers in its failure messages. ([`de78553`](https://redirect.github.com/google/truth/commit/de785536d), [`07318c2`](https://redirect.github.com/google/truth/commit/07318c23e)) - Improved some assertions that print class names to print simpler names (e.g., `Integer` instead of `java.lang.Integer`). ([`0ba72d6`](https://redirect.github.com/google/truth/commit/0ba72d60fdb384aa97da03e2403a6757f63bf129)) - Changed `ExpectFailure` to never generate "value of" lines based on bytecode. This slightly simplifies writing new tests with `ExpectFailure` and prevents future behavior changes in some `ExpectFailure` tests that already exist. However, it may also require changes to other existing `ExpectFailure` tests to remove or change any assertions about the "value of" line. ([`3caa0e8`](https://redirect.github.com/google/truth/commit/3caa0e845)) - Our Android `minSdkVersion` is now 23 (Marshmallow). This follows the minimum of Google's foundational Android libraries, and we expect it to have no practical impact on users. ([`c85c75c`](https://redirect.github.com/google/truth/commit/c85c75cf4)) - Changed our GWT/J2CL artifact to omit usages of `@NullMarked`. This was making all our types non-null in those environments, since we don't yet use `@Nullable` in the GWT/J2CL artifact. ([`6392d37`](https://redirect.github.com/google/truth/commit/6392d37e7))
--- ### 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 was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/googleapis/java-spanner). --- pom.xml | 2 +- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- samples/snippets/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 0416378525..709572d7db 100644 --- a/pom.xml +++ b/pom.xml @@ -121,7 +121,7 @@ com.google.truth truth - 1.4.4 + 1.4.5 test diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index d13e81bafc..01c17d82e8 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -100,7 +100,7 @@ com.google.truth truth - 1.4.4 + 1.4.5 test
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 659f74b675..086a767845 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -99,7 +99,7 @@ com.google.truth truth - 1.4.4 + 1.4.5 test
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 22c6400079..839ce261d5 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -111,7 +111,7 @@ com.google.truth truth - 1.4.4 + 1.4.5 test
From fe14beff7e8bab502d7f4d744763f85a096eeacb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 27 Sep 2025 15:40:25 +0100 Subject: [PATCH 10/34] chore(deps): update dependency com.google.cloud:google-cloud-spanner to v6.101.1 (#4062) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.google.cloud:google-cloud-spanner](https://redirect.github.com/googleapis/java-spanner) | `6.99.0` -> `6.101.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.google.cloud:google-cloud-spanner/6.101.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.google.cloud:google-cloud-spanner/6.101.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.google.cloud:google-cloud-spanner/6.99.0/6.101.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.google.cloud:google-cloud-spanner/6.99.0/6.101.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
googleapis/java-spanner (com.google.cloud:google-cloud-spanner) ### [`v6.101.1`](https://redirect.github.com/googleapis/java-spanner/blob/HEAD/CHANGELOG.md#61011-2025-09-26) [Compare Source](https://redirect.github.com/googleapis/java-spanner/compare/v6.101.0...v6.101.1) ##### Bug Fixes - Potential NullPointerException in LocalConnectionChecker ([#​4092](https://redirect.github.com/googleapis/java-spanner/issues/4092)) ([3b9f597](https://redirect.github.com/googleapis/java-spanner/commit/3b9f597ba60199a16556824568b24908ce938a69)) ### [`v6.101.0`](https://redirect.github.com/googleapis/java-spanner/blob/HEAD/CHANGELOG.md#61010-2025-09-26) [Compare Source](https://redirect.github.com/googleapis/java-spanner/compare/v6.100.0...v6.101.0) ##### Features - Add transaction\_timeout connection property ([#​4056](https://redirect.github.com/googleapis/java-spanner/issues/4056)) ([cdc52d4](https://redirect.github.com/googleapis/java-spanner/commit/cdc52d49b39c57e7255f4e09fb33a41f4810397d)) - TPC support ([#​4055](https://redirect.github.com/googleapis/java-spanner/issues/4055)) ([7625cce](https://redirect.github.com/googleapis/java-spanner/commit/7625cce9ad48b14a1cff9c2ede86a066ea292bef)) ##### Bug Fixes - **deps:** Update the Java code generator (gapic-generator-java) to 2.62.2 ([8d6cbf6](https://redirect.github.com/googleapis/java-spanner/commit/8d6cbf6bea9cbd823b8f0070516e34b4d8428e87)) - Potential NullPointerException in Value#hashCode ([#​4046](https://redirect.github.com/googleapis/java-spanner/issues/4046)) ([74abb34](https://redirect.github.com/googleapis/java-spanner/commit/74abb341e2ea42bbf0a2de4ec3e3555335b5fd9f)) - Recalculate remaining statement timeout after retry ([#​4053](https://redirect.github.com/googleapis/java-spanner/issues/4053)) ([5e26596](https://redirect.github.com/googleapis/java-spanner/commit/5e26596f4f9c924260da0908920854d8ddfc626b)) ##### Dependencies - Update dependency com.google.cloud:sdk-platform-java-config to v3.52.2 ([#​4057](https://redirect.github.com/googleapis/java-spanner/issues/4057)) ([d782aff](https://redirect.github.com/googleapis/java-spanner/commit/d782aff63ff81e1b760690d4dee3e566028d522e)) ### [`v6.100.0`](https://redirect.github.com/googleapis/java-spanner/blob/HEAD/CHANGELOG.md#61000-2025-09-11) [Compare Source](https://redirect.github.com/googleapis/java-spanner/compare/v6.99.0...v6.100.0) ##### Features - Read\_lock\_mode support for connections ([#​4031](https://redirect.github.com/googleapis/java-spanner/issues/4031)) ([261abb4](https://redirect.github.com/googleapis/java-spanner/commit/261abb4b9c5ff00fac2d816a31926b23264657c4)) ##### Bug Fixes - **deps:** Update the Java code generator (gapic-generator-java) to 2.62.1 ([e9773a7](https://redirect.github.com/googleapis/java-spanner/commit/e9773a7aa27a414d56093b4e09e0f197a07b5980)) - Disable afe\_connectivity\_error\_count metric ([#​4041](https://redirect.github.com/googleapis/java-spanner/issues/4041)) ([f89c1c0](https://redirect.github.com/googleapis/java-spanner/commit/f89c1c0517ba6b895f405b0085b8df41aac952be)) - Skip session delete in case of multiplexed sessions ([#​4029](https://redirect.github.com/googleapis/java-spanner/issues/4029)) ([8bcb09d](https://redirect.github.com/googleapis/java-spanner/commit/8bcb09d141fe986c92ccacbaa9a45302c5c8e79d)) ##### Dependencies - Update dependency com.google.cloud:sdk-platform-java-config to v3.52.1 ([#​4034](https://redirect.github.com/googleapis/java-spanner/issues/4034)) ([13bfa7c](https://redirect.github.com/googleapis/java-spanner/commit/13bfa7c68c7ea887e679fb5504dceb85cbb43cb9)) ##### Documentation - A comment for field `ranges` in message `.google.spanner.v1.KeySet` is changed ([e9773a7](https://redirect.github.com/googleapis/java-spanner/commit/e9773a7aa27a414d56093b4e09e0f197a07b5980))
--- ### 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 was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/googleapis/java-spanner). --- benchmarks/pom.xml | 2 +- samples/install-without-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 49f456ad9c..b47919cd77 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -97,7 +97,7 @@ com.google.cloud google-cloud-spanner - 6.99.0 + 6.101.1 com.google.auto.value diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 01c17d82e8..f8b4ef71d7 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -33,7 +33,7 @@ com.google.cloud google-cloud-spanner - 6.99.0 + 6.101.1 From b262edcfc4713bb64986bc4acd3f02b69d3367f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Mon, 29 Sep 2025 05:17:35 +0200 Subject: [PATCH 11/34] deps: update all dependencies (#4099) * deps: update all dependencies * chore: generate libraries at Sat Sep 27 15:59:02 UTC 2025 --------- Co-authored-by: cloud-java-bot --- .github/workflows/auto-release.yaml | 2 +- .../hermetic_library_generation.yaml | 2 +- ...against-emulator-with-regular-session.yaml | 2 +- .../integration-tests-against-emulator.yaml | 2 +- .../workflows/unmanaged_dependency_check.yaml | 2 +- README.md | 2 +- benchmarks/pom.xml | 19 ++++++------------- google-cloud-spanner-executor/pom.xml | 8 ++++---- google-cloud-spanner/pom.xml | 8 ++++---- samples/install-without-bom/pom.xml | 4 ++-- samples/snapshot/pom.xml | 4 ++-- 11 files changed, 24 insertions(+), 31 deletions(-) diff --git a/.github/workflows/auto-release.yaml b/.github/workflows/auto-release.yaml index 18d92e5a28..0cda6b04f7 100644 --- a/.github/workflows/auto-release.yaml +++ b/.github/workflows/auto-release.yaml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest if: contains(github.head_ref, 'release-please') steps: - - uses: actions/github-script@v7 + - uses: actions/github-script@v8 with: github-token: ${{secrets.YOSHI_APPROVER_TOKEN}} debug: true diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 6d1265ec78..640f7bbd53 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -32,7 +32,7 @@ jobs: else echo "SHOULD_RUN=true" >> $GITHUB_ENV fi - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 if: env.SHOULD_RUN == 'true' with: fetch-depth: 0 diff --git a/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml b/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml index 3d64f41909..371620cf5a 100644 --- a/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml +++ b/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml @@ -16,7 +16,7 @@ jobs: - 9020:9020 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: stCarolas/setup-maven@v5 with: maven-version: 3.8.1 diff --git a/.github/workflows/integration-tests-against-emulator.yaml b/.github/workflows/integration-tests-against-emulator.yaml index a9f5e46ca3..cd677dd1a6 100644 --- a/.github/workflows/integration-tests-against-emulator.yaml +++ b/.github/workflows/integration-tests-against-emulator.yaml @@ -16,7 +16,7 @@ jobs: - 9020:9020 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: stCarolas/setup-maven@v5 with: maven-version: 3.8.1 diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 11dc247ab0..b14cc4f386 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -5,7 +5,7 @@ jobs: unmanaged_dependency_check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-java@v5 with: distribution: temurin diff --git a/README.md b/README.md index c0eb12946e..756f365131 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-spanner - 6.99.0 + 6.101.1 ``` diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index b47919cd77..61a0fe6f1f 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -34,7 +34,7 @@ UTF-8 UTF-8 2.10.1 - 1.47.0 + 1.54.1
@@ -49,17 +49,17 @@ com.google.cloud.opentelemetry exporter-trace - 0.33.0 + 0.36.0 com.google.cloud.opentelemetry exporter-metrics - 0.33.0 + 0.36.0 com.google.cloud google-cloud-monitoring - 3.63.0 + 3.76.0 @@ -87,13 +87,6 @@ re2j 1.8 - - io.opentelemetry - opentelemetry-bom - 1.50.0 - pom - import - com.google.cloud google-cloud-spanner @@ -118,7 +111,7 @@ commons-cli commons-cli - 1.9.0 + 1.10.0 @@ -142,7 +135,7 @@ com.spotify.fmt fmt-maven-plugin - 2.27 + 2.29 diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index ef98adadfb..eb52d4a0b9 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -64,7 +64,7 @@ com.google.cloud google-cloud-trace - 2.62.0 + 2.75.0 io.grpc @@ -137,7 +137,7 @@ com.google.api.grpc proto-google-cloud-trace-v1 - 2.62.0 + 2.75.0 com.google.api.grpc @@ -170,12 +170,12 @@ commons-cli commons-cli - 1.9.0 + 1.10.0 commons-io commons-io - 2.19.0 + 2.20.0 diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 6cf9bcb8bf..62e231394d 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -269,12 +269,12 @@ com.google.cloud google-cloud-monitoring - 3.63.0 + 3.76.0 com.google.api.grpc proto-google-cloud-monitoring-v3 - 3.63.0 + 3.76.0 com.google.auth @@ -475,13 +475,13 @@ com.google.cloud google-cloud-trace - 2.62.0 + 2.75.0 test com.google.api.grpc proto-google-cloud-trace-v1 - 2.62.0 + 2.75.0 test diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index f8b4ef71d7..83ef057473 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -23,8 +23,8 @@ 1.8 UTF-8 0.31.1 - 2.62.0 - 3.63.0 + 2.75.0 + 3.76.0
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 086a767845..53c9153862 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -23,8 +23,8 @@ 1.8 UTF-8 0.31.1 - 2.62.0 - 3.63.0 + 2.75.0 + 3.76.0
From 4c88eb91a321aa718f957296012f9e7501c7caec Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 29 Sep 2025 07:15:49 +0100 Subject: [PATCH 12/34] deps: update actions/checkout action to v5 (#4069) --- .github/workflows/update_generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml index a7e14bb483..59e39834dd 100644 --- a/.github/workflows/update_generation_config.yaml +++ b/.github/workflows/update_generation_config.yaml @@ -26,7 +26,7 @@ jobs: # the branch into which the pull request is merged base_branch: main steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} From 9f321377d73dae78fb99c2e5d5a20330d123dd0a Mon Sep 17 00:00:00 2001 From: Kyle Insaurralde <34525787+kinsaurralde@users.noreply.github.com> Date: Mon, 29 Sep 2025 01:44:33 -0700 Subject: [PATCH 13/34] test: Add integration test to check that requests with large message sizes that are under the limit succeed (#4037) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add integration test to check that requests with large message sizes (but still under limit) succeed * formatting fixes --------- Co-authored-by: Knut Olav LΓΈite --- .../cloud/spanner/it/ITTransactionTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java index dbefb73294..76b5436aba 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITTransactionTest.java @@ -56,6 +56,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Random; import java.util.Vector; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -74,6 +75,8 @@ public class ITTransactionTest { @ClassRule public static IntegrationTestEnv env = new IntegrationTestEnv(); private static Database db; private static DatabaseClient client; + private static Database largeMessageDb; + private static DatabaseClient largeMessageClient; /** Sequence for assigning unique keys to test cases. */ private static int seq; @@ -88,11 +91,31 @@ public static void setUpDatabase() { + " V INT64," + ") PRIMARY KEY (K)"); client = env.getTestHelper().getDatabaseClient(db); + + largeMessageDb = + env.getTestHelper() + .createTestDatabase( + "CREATE TABLE T (" + + " K STRING(MAX) NOT NULL," + + " col0 BYTES(MAX)," + + " col1 BYTES(MAX)," + + " col2 BYTES(MAX)," + + " col3 BYTES(MAX)," + + " col4 BYTES(MAX)," + + " col5 BYTES(MAX)," + + " col6 BYTES(MAX)," + + " col7 BYTES(MAX)," + + " col8 BYTES(MAX)," + + " col9 BYTES(MAX)," + + ") PRIMARY KEY (K)"); + largeMessageClient = env.getTestHelper().getDatabaseClient(largeMessageDb); } @Before public void removeTestData() { client.writeAtLeastOnce(Collections.singletonList(Mutation.delete("T", KeySet.all()))); + largeMessageClient.writeAtLeastOnce( + Collections.singletonList(Mutation.delete("T", KeySet.all()))); } private static String uniqueKey() { @@ -561,6 +584,25 @@ public void testTxWithUncaughtError() { } } + @Test + public void testTxWithLargeMessageSize() { + int bytesPerColumn = 10000000; // 10MB + String key = uniqueKey(); + Random random = new Random(); + List mutations = new ArrayList(); + Mutation.WriteBuilder builder = Mutation.newInsertOrUpdateBuilder("T").set("K").to(key); + for (int j = 0; j < 7; j++) { + byte[] data = new byte[bytesPerColumn]; + random.nextBytes(data); + builder + .set("col" + j) + .to(com.google.cloud.spanner.Value.bytes(com.google.cloud.ByteArray.copyFrom(data))); + } + mutations.add(builder.build()); + // This large message is under the 100MB limit. + largeMessageClient.write(mutations); + } + @Test public void testTxWithUncaughtErrorAfterSuccessfulBegin() { try { From 5658c8378aa2e8028d4ef7dfaf94b647f33cd812 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 29 Sep 2025 10:31:23 +0100 Subject: [PATCH 14/34] deps: update dependency org.json:json to v20250517 (#3881) --- google-cloud-spanner/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 62e231394d..965991b346 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -428,7 +428,7 @@ org.json json - 20250107 + 20250517 test From 3beea6ac4eb53b70db34e0a2d2e33e56f450c88b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Thu, 2 Oct 2025 13:00:37 +0200 Subject: [PATCH 15/34] fix: automatically set default_sequence_kind for CREATE SEQUENCE (#4105) * fix: automatically set default_sequence_kind for CREATE SEQUENCE * chore: generate libraries at Thu Oct 2 09:09:42 UTC 2025 --------- Co-authored-by: cloud-java-bot --- .github/workflows/update_generation_config.yaml | 2 +- .../cloud/spanner/MissingDefaultSequenceKindException.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml index 59e39834dd..a7e14bb483 100644 --- a/.github/workflows/update_generation_config.yaml +++ b/.github/workflows/update_generation_config.yaml @@ -26,7 +26,7 @@ jobs: # the branch into which the pull request is merged base_branch: main steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/MissingDefaultSequenceKindException.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/MissingDefaultSequenceKindException.java index f153cf6fe4..80e0ac7efa 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/MissingDefaultSequenceKindException.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/MissingDefaultSequenceKindException.java @@ -29,8 +29,8 @@ public class MissingDefaultSequenceKindException extends SpannerException { private static final Pattern PATTERN = Pattern.compile( - "The sequence kind of an identity column .+ is not specified\\. Please specify the" - + " sequence kind explicitly or set the database option `default_sequence_kind`\\."); + ".*Please specify the sequence kind explicitly or set the database option" + + " `default_sequence_kind`\\."); /** Private constructor. Use {@link SpannerExceptionFactory} to create instances. */ MissingDefaultSequenceKindException( From 542c6aa63bfdd526070f14cb76921dd34527c1f9 Mon Sep 17 00:00:00 2001 From: "rayudu.alp" Date: Fri, 3 Oct 2025 09:45:13 +0530 Subject: [PATCH 16/34] feat: support statement_timeout in connection url (#4103) --- .../spanner/connection/ConnectionImpl.java | 19 ++++++- .../connection/ConnectionProperties.java | 9 ++++ .../connection/ConnectionOptionsTest.java | 2 + .../connection/StatementTimeoutTest.java | 50 ++++++++++++++++++- 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java index 8ae4c0fc5f..07ded59d85 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java @@ -44,6 +44,7 @@ import static com.google.cloud.spanner.connection.ConnectionProperties.RETURN_COMMIT_STATS; import static com.google.cloud.spanner.connection.ConnectionProperties.RPC_PRIORITY; import static com.google.cloud.spanner.connection.ConnectionProperties.SAVEPOINT_SUPPORT; +import static com.google.cloud.spanner.connection.ConnectionProperties.STATEMENT_TIMEOUT; import static com.google.cloud.spanner.connection.ConnectionProperties.TRACING_PREFIX; import static com.google.cloud.spanner.connection.ConnectionProperties.TRANSACTION_TIMEOUT; @@ -345,7 +346,7 @@ static UnitOfWorkType of(TransactionMode transactionMode) { && getDialect() == Dialect.POSTGRESQL ? Type.TRANSACTIONAL : Type.NON_TRANSACTIONAL)); - + setInitialStatementTimeout(options.getInitialConnectionPropertyValue(STATEMENT_TIMEOUT)); // (Re)set the state of the connection to the default. setDefaultTransactionOptions(getDefaultIsolationLevel()); } @@ -379,6 +380,7 @@ && getDialect() == Dialect.POSTGRESQL new ConnectionState( options.getInitialConnectionPropertyValues(), Suppliers.ofInstance(Type.NON_TRANSACTIONAL)); + setInitialStatementTimeout(options.getInitialConnectionPropertyValue(STATEMENT_TIMEOUT)); setReadOnly(options.isReadOnly()); setAutocommit(options.isAutocommit()); setReturnCommitStats(options.isReturnCommitStats()); @@ -390,6 +392,21 @@ public Spanner getSpanner() { return this.spanner; } + private void setInitialStatementTimeout(Duration duration) { + if (duration == null || duration.isZero()) { + return; + } + com.google.protobuf.Duration protoDuration = + com.google.protobuf.Duration.newBuilder() + .setSeconds(duration.getSeconds()) + .setNanos(duration.getNano()) + .build(); + TimeUnit unit = + ReadOnlyStalenessUtil.getAppropriateTimeUnit( + new ReadOnlyStalenessUtil.DurationGetter(protoDuration)); + setStatementTimeout(ReadOnlyStalenessUtil.durationToUnits(protoDuration, unit), unit); + } + private DdlClient createDdlClient() { return DdlClient.newBuilder() .setDatabaseAdminClient(spanner.getDatabaseAdminClient()) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java index 3bb5d71e48..ae64f44ebc 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java @@ -494,6 +494,15 @@ public class ConnectionProperties { .toArray(new ReadLockMode[0]), ReadLockModeConverter.INSTANCE, Context.USER); + static final ConnectionProperty STATEMENT_TIMEOUT = + create( + "statement_timeout", + "Adds a timeout to all statements executed on this connection. " + + "This property is only used when a statement timeout is specified.", + null, + null, + DurationConverter.INSTANCE, + Context.USER); static final ConnectionProperty TRANSACTION_TIMEOUT = create( "transaction_timeout", diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java index e9af95d9de..18fd5cb614 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java @@ -436,6 +436,8 @@ public void testBuilderSetUri() { "cloudspanner://spanner.googleapis.com/projects/test-project-123/instances/test-instance?autocommit=true;readonly=false"); builder.setUri( "cloudspanner://spanner.googleapis.com/projects/test-project-123?autocommit=true;readonly=false"); + builder.setUri( + "cloudspanner://spanner.googleapis.com/projects/test-project-123?statement_timeout='10s';transaction_timeout='60s'"); // set invalid uri's setInvalidUri( diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementTimeoutTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementTimeoutTest.java index b1adb3861b..e854b3d9d9 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementTimeoutTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/StatementTimeoutTest.java @@ -108,10 +108,12 @@ public static Object[] parameters() { @Parameter public StatementExecutorType statementExecutorType; - protected ITConnection createConnection() { + protected ITConnection createConnection(String additionalUrlOptions) { + String urlSuffix = + ";trackSessionLeaks=false" + (additionalUrlOptions == null ? "" : additionalUrlOptions); ConnectionOptions options = ConnectionOptions.newBuilder() - .setUri(getBaseUrl() + ";trackSessionLeaks=false") + .setUri(getBaseUrl() + urlSuffix) .setStatementExecutorType(statementExecutorType) .setConfigurator( optionsConfigurator -> { @@ -135,6 +137,10 @@ protected ITConnection createConnection() { return createITConnection(options); } + protected ITConnection createConnection() { + return createConnection(""); + } + @Before public void setup() { // Set up a connection and get the dialect to ensure that the auto-detect-dialect query has @@ -169,6 +175,22 @@ public void testTimeoutExceptionReadOnlyAutocommit() { } } + @Test + public void testUrlTimeoutExceptionReadOnlyAutocommit() { + mockSpanner.setExecuteStreamingSqlExecutionTime( + SimulatedExecutionTime.ofMinimumAndRandomTime(EXECUTION_TIME_SLOW_STATEMENT, 0)); + + try (Connection connection = + createConnection(";statement_timeout='" + TIMEOUT_FOR_SLOW_STATEMENTS + "ms'")) { + connection.setAutocommit(true); + connection.setReadOnly(true); + SpannerException e = + assertThrows( + SpannerException.class, () -> connection.executeQuery(SELECT_RANDOM_STATEMENT)); + assertEquals(ErrorCode.DEADLINE_EXCEEDED, e.getErrorCode()); + } + } + @Test public void testTimeoutExceptionReadOnlyAutocommitMultipleStatements() { mockSpanner.setExecuteStreamingSqlExecutionTime( @@ -277,6 +299,30 @@ public void testTimeoutExceptionReadWriteAutocommitMultipleStatements() { } } + @Test + public void testUrlStatementTimeoutOverrideToSucceed() { + mockSpanner.setExecuteStreamingSqlExecutionTime( + SimulatedExecutionTime.ofMinimumAndRandomTime(EXECUTION_TIME_SLOW_STATEMENT, 0)); + + try (Connection connection = + createConnection(";statement_timeout='" + TIMEOUT_FOR_SLOW_STATEMENTS + "ms'")) { + connection.setAutocommit(true); + for (int i = 0; i < 2; i++) { + SpannerException e = + assertThrows( + SpannerException.class, () -> connection.executeQuery(SELECT_RANDOM_STATEMENT)); + assertEquals(ErrorCode.DEADLINE_EXCEEDED, e.getErrorCode()); + } + + // Remove slow behavior and verify a fast query succeeds after overriding the timeout. + mockSpanner.removeAllExecutionTimes(); + connection.setStatementTimeout(TIMEOUT_FOR_FAST_STATEMENTS, TimeUnit.MILLISECONDS); + try (ResultSet rs = connection.executeQuery(SELECT_RANDOM_STATEMENT)) { + assertNotNull(rs); + } + } + } + @Test public void testTimeoutExceptionReadWriteAutocommitSlowUpdate() { mockSpanner.setExecuteSqlExecutionTime( From 492026605a8baf8fb0802cb28671f8ad88bc4486 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> Date: Sat, 4 Oct 2025 15:48:28 +0530 Subject: [PATCH 17/34] ci: Design and implement a comprehensive performance regression presubmit/continuous job (#4104) * ci: Design and implement a comprehensive performance regression presubmit/continuous job * chore: generate libraries at Wed Oct 1 08:25:18 UTC 2025 * Addressed comments --------- Co-authored-by: cloud-java-bot --- google-cloud-spanner/pom.xml | 27 ++- .../SpannerCloudMonitoringExporter.java | 18 +- .../google/cloud/spanner/SpannerOptions.java | 5 + .../benchmarking/BenchmarkValidator.java | 156 ++++++++++++ .../benchmarking/MonitoringServiceImpl.java | 39 +++ .../spanner/benchmarking/ReadBenchmark.java | 228 ++++++++++++++++++ .../cloud/spanner/jmh/jmh-baseline.json | 22 ++ 7 files changed, 493 insertions(+), 2 deletions(-) create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/BenchmarkValidator.java create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/MonitoringServiceImpl.java create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/ReadBenchmark.java create mode 100644 google-cloud-spanner/src/test/resources/com/google/cloud/spanner/jmh/jmh-baseline.json diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 965991b346..f7d78e5e36 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -276,6 +276,12 @@ proto-google-cloud-monitoring-v3 3.76.0 + + com.google.api.grpc + grpc-google-cloud-monitoring-v3 + 3.63.0 + test + com.google.auth google-auth-library-oauth2-http @@ -522,7 +528,11 @@ -classpath org.openjdk.jmh.Main - ${benchmark.name} + ${benchmark.name} + -rf + JSON + -rff + jmh-results.json @@ -544,6 +554,21 @@ + + validate-benchmark + + + + org.codehaus.mojo + exec-maven-plugin + + com.google.cloud.spanner.benchmarking.BenchmarkValidator + test + + + + + slow-tests diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerCloudMonitoringExporter.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerCloudMonitoringExporter.java index 40202a0eef..bedf660007 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerCloudMonitoringExporter.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerCloudMonitoringExporter.java @@ -22,8 +22,10 @@ import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.rpc.PermissionDeniedException; import com.google.auth.Credentials; +import com.google.cloud.NoCredentials; import com.google.cloud.monitoring.v3.MetricServiceClient; import com.google.cloud.monitoring.v3.MetricServiceSettings; import com.google.common.annotations.VisibleForTesting; @@ -34,6 +36,7 @@ import com.google.monitoring.v3.ProjectName; import com.google.monitoring.v3.TimeSeries; import com.google.protobuf.Empty; +import io.grpc.ManagedChannelBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; @@ -79,7 +82,7 @@ static SpannerCloudMonitoringExporter create( throws IOException { MetricServiceSettings.Builder settingsBuilder = MetricServiceSettings.newBuilder(); CredentialsProvider credentialsProvider; - if (credentials == null) { + if (credentials == null || credentials instanceof NoCredentials) { credentialsProvider = NoCredentialsProvider.create(); } else { credentialsProvider = FixedCredentialsProvider.create(credentials); @@ -92,6 +95,19 @@ static SpannerCloudMonitoringExporter create( settingsBuilder.setUniverseDomain(universeDomain); } + if (System.getProperty("jmh.monitoring-server-port") != null) { + settingsBuilder.setTransportChannelProvider( + InstantiatingGrpcChannelProvider.newBuilder() + .setCredentials(NoCredentials.getInstance()) + .setChannelConfigurator( + managedChannelBuilder -> + ManagedChannelBuilder.forAddress( + "0.0.0.0", + Integer.parseInt(System.getProperty("jmh.monitoring-server-port"))) + .usePlaintext()) + .build()); + } + Duration timeout = Duration.ofMinutes(1); // TODO: createServiceTimeSeries needs special handling if the request failed. Leaving // it as not retried for now. diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index af4ed58bad..765114dc68 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -2013,6 +2013,11 @@ public CallCredentialsProvider getCallCredentialsProvider() { } private boolean usesNoCredentials() { + // When JMH is enabled, we need to enable built-in metrics + if (System.getProperty("jmh.enabled") != null + && System.getProperty("jmh.enabled").equals("true")) { + return false; + } return Objects.equals(getCredentials(), NoCredentials.getInstance()); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/BenchmarkValidator.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/BenchmarkValidator.java new file mode 100644 index 0000000000..225197af6c --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/BenchmarkValidator.java @@ -0,0 +1,156 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.spanner.benchmarking; + +import com.google.cloud.spanner.benchmarking.BenchmarkValidator.BaselineResult.BenchmarkResult; +import com.google.cloud.spanner.benchmarking.BenchmarkValidator.BaselineResult.BenchmarkResult.Percentile; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BenchmarkValidator { + + private final BaselineResult expectedResults; + private final List actualResults; + + public BenchmarkValidator(String baselineFile, String actualFile) { + Gson gson = new Gson(); + // Load expected result JSON from resource folder + this.expectedResults = gson.fromJson(loadJsonFromResources(baselineFile), BaselineResult.class); + // Load the actual result from current benchmarking run + this.actualResults = + gson.fromJson( + loadJsonFromFile(actualFile), + new TypeToken>() {}.getType()); + } + + void validate() { + // Validating the resultant percentile against expected percentile with allowed threshold + for (ActualBenchmarkResult actualResult : actualResults) { + BenchmarkResult expectResult = expectedResults.benchmarkResultMap.get(actualResult.benchmark); + if (expectResult == null) { + throw new ValidationException( + "Missing expected benchmark configuration for actual benchmarking"); + } + Map actualPercentilesMap = actualResult.primaryMetric.scorePercentiles; + // We will only be comparing the percentiles(p50, p90, p90) which are configured in the + // expected percentiles. This allows some checks to be disabled if required. + for (Percentile expectedPercentile : expectResult.scorePercentiles) { + String percentile = expectedPercentile.percentile; + double difference = + calculatePercentageDifference( + expectedPercentile.baseline, actualPercentilesMap.get(percentile)); + // if an absolute different in percentage is greater than allowed difference + // Then we are throwing validation error + if (Math.abs(Math.ceil(difference)) > expectedPercentile.difference) { + throw new ValidationException( + String.format( + "[%s][%s] Expected percentile %s[+/-%s] but got %s", + actualResult.benchmark, + percentile, + expectedPercentile.baseline, + expectedPercentile.difference, + actualPercentilesMap.get(percentile))); + } + } + } + } + + public static double calculatePercentageDifference(double base, double compareWith) { + if (base == 0) { + return 0.0; + } + return ((compareWith - base) / base) * 100; + } + + private String loadJsonFromFile(String file) { + try { + return new String(Files.readAllBytes(Paths.get(file))); + } catch (IOException e) { + throw new ValidationException("Failed to read file: " + file, e); + } + } + + private String loadJsonFromResources(String baselineFile) { + URL resourceUrl = getClass().getClassLoader().getResource(baselineFile); + if (resourceUrl == null) { + throw new ValidationException("File not found: " + baselineFile); + } + File file = new File(resourceUrl.getFile()); + return loadJsonFromFile(file.getAbsolutePath()); + } + + static class ActualBenchmarkResult { + String benchmark; + PrimaryMetric primaryMetric; + + static class PrimaryMetric { + Map scorePercentiles; + } + } + + static class BaselineResult { + Map benchmarkResultMap; + + static class BenchmarkResult { + List scorePercentiles; + + static class Percentile { + String percentile; + Double baseline; + Double difference; + } + } + } + + static class ValidationException extends RuntimeException { + ValidationException(String message) { + super(message); + } + + ValidationException(String message, Throwable cause) { + super(message, cause); + } + } + + private static String parseCommandLineArgs(String[] args, String key) { + if (args == null) { + return ""; + } + for (String arg : args) { + if (arg.startsWith("--" + key)) { + String[] splits = arg.split("="); + if (splits.length == 2) { + return splits[1].trim(); + } + } + } + return ""; + } + + public static void main(String[] args) { + String actualFile = parseCommandLineArgs(args, "file"); + new BenchmarkValidator("com/google/cloud/spanner/jmh/jmh-baseline.json", actualFile).validate(); + } +} diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/MonitoringServiceImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/MonitoringServiceImpl.java new file mode 100644 index 0000000000..aaa7387612 --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/MonitoringServiceImpl.java @@ -0,0 +1,39 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.spanner.benchmarking; + +import com.google.monitoring.v3.CreateTimeSeriesRequest; +import com.google.monitoring.v3.MetricServiceGrpc.MetricServiceImplBase; +import com.google.protobuf.Empty; +import io.grpc.Status; +import io.grpc.stub.StreamObserver; + +class MonitoringServiceImpl extends MetricServiceImplBase { + + @Override + public void createServiceTimeSeries( + CreateTimeSeriesRequest request, StreamObserver responseObserver) { + try { + Thread.sleep(100); + responseObserver.onNext(Empty.getDefaultInstance()); + responseObserver.onCompleted(); + } catch (InterruptedException e) { + responseObserver.onError( + Status.CANCELLED.withCause(e).withDescription(e.getMessage()).asException()); + } + } +} diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/ReadBenchmark.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/ReadBenchmark.java new file mode 100644 index 0000000000..eed461fc89 --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/benchmarking/ReadBenchmark.java @@ -0,0 +1,228 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.spanner.benchmarking; + +import com.google.cloud.NoCredentials; +import com.google.cloud.spanner.DatabaseClient; +import com.google.cloud.spanner.DatabaseId; +import com.google.cloud.spanner.Key; +import com.google.cloud.spanner.KeySet; +import com.google.cloud.spanner.MockSpannerServiceImpl; +import com.google.cloud.spanner.MockSpannerServiceImpl.StatementResult; +import com.google.cloud.spanner.ReadContext; +import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.Spanner; +import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.Statement; +import com.google.protobuf.ListValue; +import com.google.spanner.v1.ResultSetMetadata; +import com.google.spanner.v1.StructType; +import com.google.spanner.v1.StructType.Field; +import com.google.spanner.v1.TypeCode; +import io.grpc.ManagedChannelBuilder; +import io.grpc.Server; +import io.grpc.ServerBuilder; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Threads; +import org.openjdk.jmh.annotations.Timeout; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.results.format.ResultFormatType; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.SampleTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Threads(10) +@Fork(1) +public class ReadBenchmark { + + @State(Scope.Benchmark) + public static class BenchmarkState { + + // Spanner state + Spanner spanner; + DatabaseClient databaseClient; + + // gRPC server + Server gRPCServer; + Server gRPCMonitoringServer; + + // Executors for handling parallel requests by gRPC server + ExecutorService gRPCServerExecutor; + + // Table + List columns = Arrays.asList("id", "name"); + String selectQuery = "SELECT * FROM [TABLE] WHERE ID = 1"; + + @Setup(Level.Trial) + public void setup() throws IOException { + // Enable JMH system property + System.setProperty("jmh.enabled", "true"); + + // Initializing mock spanner service + MockSpannerServiceImpl mockSpannerService = new MockSpannerServiceImpl(); + mockSpannerService.setAbortProbability(0.0D); + + // Initializing mock monitoring service + MonitoringServiceImpl mockMonitoringService = new MonitoringServiceImpl(); + + // Create a thread pool to handle concurrent requests + gRPCServerExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + + // Creating Spanner Inprocess gRPC server + gRPCServer = + ServerBuilder.forPort(0) + .addService(mockSpannerService) + .executor(gRPCServerExecutor) + .build() + .start(); + + registerMocks(mockSpannerService); + + // Creating Monitoring Inprocess gRPC server + gRPCMonitoringServer = + ServerBuilder.forPort(0).addService(mockMonitoringService).build().start(); + + // Set the monitoring host port for exporter to forward requests to local netty gRPC server + System.setProperty( + "jmh.monitoring-server-port", String.valueOf(gRPCMonitoringServer.getPort())); + + spanner = + SpannerOptions.newBuilder() + .setProjectId("[PROJECT]") + .setCredentials(NoCredentials.getInstance()) + .setChannelConfigurator( + managedChannelBuilder -> + ManagedChannelBuilder.forAddress("0.0.0.0", gRPCServer.getPort()) + .usePlaintext()) + .build() + .getService(); + databaseClient = + spanner.getDatabaseClient(DatabaseId.of("[PROJECT]", "[INSTANCE_ID]", "[DATABASE_ID]")); + } + + private void registerMocks(MockSpannerServiceImpl mockSpannerService) { + ResultSetMetadata selectMetadata = + ResultSetMetadata.newBuilder() + .setRowType( + StructType.newBuilder() + .addFields( + Field.newBuilder() + .setName("id") + .setType( + com.google.spanner.v1.Type.newBuilder() + .setCode(TypeCode.INT64) + .build()) + .build()) + .addFields( + Field.newBuilder() + .setName("name") + .setType( + com.google.spanner.v1.Type.newBuilder() + .setCode(TypeCode.STRING) + .build()) + .build()) + .build()) + .build(); + com.google.spanner.v1.ResultSet selectResultSet = + com.google.spanner.v1.ResultSet.newBuilder() + .addRows( + ListValue.newBuilder() + .addValues(com.google.protobuf.Value.newBuilder().setStringValue("1").build()) + .addValues( + com.google.protobuf.Value.newBuilder().setStringValue("[NAME]").build()) + .build()) + .setMetadata(selectMetadata) + .build(); + mockSpannerService.putStatementResult( + StatementResult.read( + "[TABLE]", KeySet.singleKey(Key.of()), this.columns, selectResultSet)); + mockSpannerService.putStatementResult( + StatementResult.query(Statement.of(this.selectQuery), selectResultSet)); + } + + @TearDown(Level.Trial) + public void tearDown() throws InterruptedException { + spanner.close(); + gRPCServer.shutdown(); + gRPCServerExecutor.shutdown(); + + // awaiting termination for servers and executors + gRPCServer.awaitTermination(10, TimeUnit.SECONDS); + gRPCServerExecutor.awaitTermination(10, TimeUnit.SECONDS); + } + } + + @Benchmark + @Warmup(time = 5, timeUnit = TimeUnit.MINUTES, iterations = 1) + @Measurement(time = 15, timeUnit = TimeUnit.MINUTES, iterations = 1) + @Timeout(time = 30, timeUnit = TimeUnit.MINUTES) + public void readBenchmark(BenchmarkState benchmarkState, Blackhole blackhole) { + try (ReadContext readContext = benchmarkState.databaseClient.singleUse()) { + try (ResultSet resultSet = + readContext.read("[TABLE]", KeySet.singleKey(Key.of("2")), benchmarkState.columns)) { + while (resultSet.next()) { + blackhole.consume(resultSet.getLong("id")); + } + } + } + } + + @Benchmark + @Warmup(time = 5, timeUnit = TimeUnit.MINUTES, iterations = 1) + @Measurement(time = 15, timeUnit = TimeUnit.MINUTES, iterations = 1) + @Timeout(time = 30, timeUnit = TimeUnit.MINUTES) + public void queryBenchmark(BenchmarkState benchmarkState, Blackhole blackhole) { + try (ReadContext readContext = benchmarkState.databaseClient.singleUse()) { + try (ResultSet resultSet = + readContext.executeQuery(Statement.of(benchmarkState.selectQuery))) { + while (resultSet.next()) { + blackhole.consume(resultSet.getLong("id")); + } + } + } + } + + public static void main(String[] args) throws RunnerException { + Options opt = + new OptionsBuilder() + .include(ReadBenchmark.class.getSimpleName()) + .result("jmh-result.json") + .resultFormat(ResultFormatType.JSON) + .build(); + new Runner(opt).run(); + } +} diff --git a/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/jmh/jmh-baseline.json b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/jmh/jmh-baseline.json new file mode 100644 index 0000000000..7753f173ee --- /dev/null +++ b/google-cloud-spanner/src/test/resources/com/google/cloud/spanner/jmh/jmh-baseline.json @@ -0,0 +1,22 @@ +{ + "benchmarkResultMap": { + "com.google.cloud.spanner.benchmarking.ReadBenchmark.queryBenchmark": { + "scorePercentiles": [ + { + "percentile": "50.0", + "baseline": "450", + "difference": "15" + } + ] + }, + "com.google.cloud.spanner.benchmarking.ReadBenchmark.readBenchmark": { + "scorePercentiles": [ + { + "percentile": "50.0", + "baseline": "450", + "difference": "15" + } + ] + } + } +} \ No newline at end of file From c12d18d45e1859d5bca53aa34f057acad2a15e4b Mon Sep 17 00:00:00 2001 From: Mridula <66699525+mpeddada1@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:15:07 -0400 Subject: [PATCH 18/34] chore: add JDK 25 to the CI build (#4134) --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8717db17ae..e2e6881c78 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,7 +25,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21] + java: [11, 17, 21, 25] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v3 From 8a8a042494b092b3dddd0c9606a63197d8a23555 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 06:01:21 +0100 Subject: [PATCH 19/34] deps: update dependency com.google.cloud:sdk-platform-java-config to v3.52.3 (#4107) --- .github/workflows/unmanaged_dependency_check.yaml | 2 +- google-cloud-spanner-bom/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index b14cc4f386..6040b5ceee 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -17,6 +17,6 @@ jobs: # repository .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.52.2 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.52.3 with: bom-path: google-cloud-spanner-bom/pom.xml diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 9996e9c964..a5340ef48a 100644 --- a/google-cloud-spanner-bom/pom.xml +++ b/google-cloud-spanner-bom/pom.xml @@ -8,7 +8,7 @@ com.google.cloud sdk-platform-java-config - 3.52.2 + 3.52.3 Google Cloud Spanner BOM diff --git a/pom.xml b/pom.xml index 709572d7db..d80652fd1e 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.52.2 + 3.52.3 From b1ec040342c6aed339152a2c3712a7cb028f6e81 Mon Sep 17 00:00:00 2001 From: surbhigarg92 Date: Wed, 8 Oct 2025 21:15:55 +0530 Subject: [PATCH 20/34] chore: Logs for Spanner Options (#4141) --- .../com/google/cloud/spanner/SpannerImpl.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java index 8f5baca64f..34fad2a69c 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java @@ -149,12 +149,56 @@ static final class ClosedException extends RuntimeException { this.dbAdminClient = new DatabaseAdminClientImpl(options.getProjectId(), gapicRpc); this.instanceClient = new InstanceAdminClientImpl(options.getProjectId(), gapicRpc, dbAdminClient); + logSpannerOptions(options); } SpannerImpl(SpannerOptions options) { this(options.getSpannerRpcV1(), options); } + private void logSpannerOptions(SpannerOptions options) { + logger.log( + Level.INFO, + "Spanner options: " + + "\nProject ID: " + + options.getProjectId() + + "\nHost: " + + options.getHost() + + "\nNum gRPC channels: " + + options.getNumChannels() + + "\nLeader aware routing enabled: " + + options.isLeaderAwareRoutingEnabled() + + "\nDirect access enabled: " + + options.isEnableDirectAccess() + + "\nActive Tracing Framework: " + + SpannerOptions.getActiveTracingFramework() + + "\nAPI tracing enabled: " + + options.isEnableApiTracing() + + "\nExtended tracing enabled: " + + options.isEnableExtendedTracing() + + "\nEnd to end tracing enabled: " + + options.isEndToEndTracingEnabled() + + "\nBuilt-in metrics enabled: " + + options.isEnableBuiltInMetrics()); + if (options.getSessionPoolOptions() != null) { + logger.log( + Level.INFO, + "Session pool options: " + + "\nSession pool min sessions: " + + options.getSessionPoolOptions().getMinSessions() + + "\nSession pool max sessions: " + + options.getSessionPoolOptions().getMaxSessions() + + "\nMultiplexed sessions enabled: " + + options.getSessionPoolOptions().getUseMultiplexedSession() + + "\nMultiplexed sessions enabled for RW: " + + options.getSessionPoolOptions().getUseMultiplexedSessionForRW() + + "\nMultiplexed sessions enabled for blind write: " + + options.getSessionPoolOptions().getUseMultiplexedSessionBlindWrite() + + "\nMultiplexed sessions enabled for partitioned ops: " + + options.getSessionPoolOptions().getUseMultiplexedSessionPartitionedOps()); + } + } + /** Returns the {@link SpannerRpc} of this {@link SpannerImpl} instance. */ SpannerRpc getRpc() { return gapicRpc; From deb8dff6c01c37a3158e8f4a28ef5e821d10092a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 8 Oct 2025 17:46:24 +0200 Subject: [PATCH 21/34] feat: add connection property for gRPC interceptor provider (#4149) * feat: add connection property for gRPC interceptor provider Add a connection property for setting a gRPC interceptor provider to use for connections. This allows JDBC and PGAdapter users to set a gRPC interceptor that should be used for the underlying Spanner client. This property is a guarded property, as it dynamically invokes the constructor of the class that is specified in the connection URL. A user must set the Java System property ENABLE_GRPC_INTERCEPTOR_PROVIDER=true when using this connection property. It should only be enabled in applications where an untrusted user cannot modify the connection URL that is being used, as that would allow an untrusted user to dynamically invoke code on the application host. * chore: generate libraries at Wed Oct 8 08:52:47 UTC 2025 --------- Co-authored-by: cloud-java-bot --- .../ClientSideStatementValueConverters.java | 49 ++++++++ .../spanner/connection/ConnectionOptions.java | 49 ++++++-- .../connection/ConnectionProperties.java | 19 +++ .../cloud/spanner/connection/SpannerPool.java | 11 +- .../GrpcInterceptorProviderTest.java | 117 ++++++++++++++++++ 5 files changed, 230 insertions(+), 15 deletions(-) create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/GrpcInterceptorProviderTest.java diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java index 57916aae58..3d796af4f0 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ClientSideStatementValueConverters.java @@ -20,6 +20,7 @@ import static com.google.cloud.spanner.connection.ReadOnlyStalenessUtil.toChronoUnit; import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.grpc.GrpcInterceptorProvider; import com.google.cloud.spanner.Dialect; import com.google.cloud.spanner.ErrorCode; import com.google.cloud.spanner.Options.RpcPriority; @@ -827,6 +828,54 @@ public CredentialsProvider convert(String credentialsProviderName) { } } + static class GrpcInterceptorProviderConverter + implements ClientSideStatementValueConverter { + static final GrpcInterceptorProviderConverter INSTANCE = new GrpcInterceptorProviderConverter(); + + private GrpcInterceptorProviderConverter() {} + + @Override + public Class getParameterClass() { + return GrpcInterceptorProvider.class; + } + + @Override + public GrpcInterceptorProvider convert(String interceptorProviderName) { + if (!Strings.isNullOrEmpty(interceptorProviderName)) { + try { + Class clazz = + (Class) Class.forName(interceptorProviderName); + Constructor constructor = + clazz.getDeclaredConstructor(); + return constructor.newInstance(); + } catch (ClassNotFoundException classNotFoundException) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, + "Unknown or invalid GrpcInterceptorProvider class name: " + interceptorProviderName, + classNotFoundException); + } catch (NoSuchMethodException noSuchMethodException) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, + "GrpcInterceptorProvider " + + interceptorProviderName + + " does not have a public no-arg constructor.", + noSuchMethodException); + } catch (InvocationTargetException + | InstantiationException + | IllegalAccessException exception) { + throw SpannerExceptionFactory.newSpannerException( + ErrorCode.INVALID_ARGUMENT, + "Failed to create an instance of " + + interceptorProviderName + + ": " + + exception.getMessage(), + exception); + } + } + return null; + } + } + /** Converter for converting strings to {@link Dialect} values. */ static class DialectConverter implements ClientSideStatementValueConverter { static final DialectConverter INSTANCE = new DialectConverter(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java index b12cd21fa7..741989ff5b 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java @@ -33,6 +33,7 @@ import static com.google.cloud.spanner.connection.ConnectionProperties.ENABLE_EXTENDED_TRACING; import static com.google.cloud.spanner.connection.ConnectionProperties.ENCODED_CREDENTIALS; import static com.google.cloud.spanner.connection.ConnectionProperties.ENDPOINT; +import static com.google.cloud.spanner.connection.ConnectionProperties.GRPC_INTERCEPTOR_PROVIDER; import static com.google.cloud.spanner.connection.ConnectionProperties.IS_EXPERIMENTAL_HOST; import static com.google.cloud.spanner.connection.ConnectionProperties.LENIENT; import static com.google.cloud.spanner.connection.ConnectionProperties.MAX_COMMIT_DELAY; @@ -59,6 +60,7 @@ import com.google.api.core.InternalApi; import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.grpc.GrpcInterceptorProvider; import com.google.api.gax.rpc.TransportChannelProvider; import com.google.auth.Credentials; import com.google.auth.oauth2.AccessToken; @@ -75,6 +77,7 @@ import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.SpannerExceptionFactory; import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.connection.ClientSideStatementValueConverters.GrpcInterceptorProviderConverter; import com.google.cloud.spanner.connection.StatementExecutor.StatementExecutorType; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; @@ -256,6 +259,9 @@ public class ConnectionOptions { public static final String ENABLE_CHANNEL_PROVIDER_SYSTEM_PROPERTY = "ENABLE_CHANNEL_PROVIDER"; + public static final String ENABLE_GRPC_INTERCEPTOR_PROVIDER_SYSTEM_PROPERTY = + "ENABLE_GRPC_INTERCEPTOR_PROVIDER"; + /** Custom user agent string is only for other Google libraries. */ static final String USER_AGENT_PROPERTY_NAME = "userAgent"; @@ -656,19 +662,6 @@ private ConnectionOptions(Builder builder) { // Create the initial connection state from the parsed properties in the connection URL. this.initialConnectionState = new ConnectionState(connectionPropertyValues); - // Check that at most one of credentials location, encoded credentials, credentials provider and - // OUAuth token has been specified in the connection URI. - Preconditions.checkArgument( - Stream.of( - getInitialConnectionPropertyValue(CREDENTIALS_URL), - getInitialConnectionPropertyValue(ENCODED_CREDENTIALS), - getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER), - getInitialConnectionPropertyValue(OAUTH_TOKEN)) - .filter(Objects::nonNull) - .count() - <= 1, - "Specify only one of credentialsUrl, encodedCredentials, credentialsProvider and OAuth" - + " token"); checkGuardedProperty( getInitialConnectionPropertyValue(ENCODED_CREDENTIALS), ENABLE_ENCODED_CREDENTIALS_SYSTEM_PROPERTY, @@ -683,6 +676,23 @@ private ConnectionOptions(Builder builder) { getInitialConnectionPropertyValue(CHANNEL_PROVIDER), ENABLE_CHANNEL_PROVIDER_SYSTEM_PROPERTY, CHANNEL_PROVIDER_PROPERTY_NAME); + checkGuardedProperty( + getInitialConnectionPropertyValue(GRPC_INTERCEPTOR_PROVIDER), + ENABLE_GRPC_INTERCEPTOR_PROVIDER_SYSTEM_PROPERTY, + GRPC_INTERCEPTOR_PROVIDER.getName()); + // Check that at most one of credentials location, encoded credentials, credentials provider and + // OUAuth token has been specified in the connection URI. + Preconditions.checkArgument( + Stream.of( + getInitialConnectionPropertyValue(CREDENTIALS_URL), + getInitialConnectionPropertyValue(ENCODED_CREDENTIALS), + getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER), + getInitialConnectionPropertyValue(OAUTH_TOKEN)) + .filter(Objects::nonNull) + .count() + <= 1, + "Specify only one of credentialsUrl, encodedCredentials, credentialsProvider and OAuth" + + " token"); boolean usePlainText = getInitialConnectionPropertyValue(AUTO_CONFIG_EMULATOR) @@ -999,6 +1009,19 @@ public TransportChannelProvider getChannelProvider() { } } + String getGrpcInterceptorProviderName() { + return getInitialConnectionPropertyValue(GRPC_INTERCEPTOR_PROVIDER); + } + + /** Returns the gRPC interceptor provider that has been configured. */ + public GrpcInterceptorProvider getGrpcInterceptorProvider() { + String interceptorProvider = getInitialConnectionPropertyValue(GRPC_INTERCEPTOR_PROVIDER); + if (interceptorProvider == null) { + return null; + } + return GrpcInterceptorProviderConverter.INSTANCE.convert(interceptorProvider); + } + /** * The database role that is used for this connection. Assigning a role to a connection can be * used to for example restrict the access of a connection to a specific set of tables. diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java index ae64f44ebc..200de9bec8 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java @@ -75,6 +75,7 @@ import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_API_TRACING_PROPERTY_NAME; import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_END_TO_END_TRACING_PROPERTY_NAME; import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_EXTENDED_TRACING_PROPERTY_NAME; +import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_GRPC_INTERCEPTOR_PROVIDER_SYSTEM_PROPERTY; import static com.google.cloud.spanner.connection.ConnectionOptions.ENCODED_CREDENTIALS_PROPERTY_NAME; import static com.google.cloud.spanner.connection.ConnectionOptions.ENDPOINT_PROPERTY_NAME; import static com.google.cloud.spanner.connection.ConnectionOptions.IS_EXPERIMENTAL_HOST_PROPERTY_NAME; @@ -101,6 +102,7 @@ import static com.google.cloud.spanner.connection.ConnectionProperty.castProperty; import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.grpc.GrpcInterceptorProvider; import com.google.cloud.spanner.Dialect; import com.google.cloud.spanner.DmlBatchUpdateCountVerificationFailedException; import com.google.cloud.spanner.Options.RpcPriority; @@ -286,6 +288,23 @@ public class ConnectionProperties { null, CredentialsProviderConverter.INSTANCE, Context.STARTUP); + static final ConnectionProperty GRPC_INTERCEPTOR_PROVIDER = + create( + "grpc_interceptor_provider", + "The class name of a " + + GrpcInterceptorProvider.class.getName() + + " implementation that should be used to provide interceptors for the underlying" + + " Spanner client. This is a guarded property that can only be set if the Java" + + " System Property " + + ENABLE_GRPC_INTERCEPTOR_PROVIDER_SYSTEM_PROPERTY + + " has been set to true. This property should only be set to true on systems where" + + " an untrusted user cannot modify the connection URL, as using this property will" + + " dynamically invoke the constructor of the class specified. This means that any" + + " user that can modify the connection URL, can also dynamically invoke code on the" + + " host where the application is running.", + null, + StringValueConverter.INSTANCE, + Context.STARTUP); static final ConnectionProperty USER_AGENT = create( diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java index c1cf3ae679..e78a646f07 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java @@ -166,6 +166,7 @@ static class SpannerPoolKey { private final boolean isExperimentalHost; private final Boolean enableDirectAccess; private final String universeDomain; + private final String grpcInterceptorProvider; @VisibleForTesting static SpannerPoolKey of(ConnectionOptions options) { @@ -202,6 +203,7 @@ private SpannerPoolKey(ConnectionOptions options) throws IOException { this.isExperimentalHost = options.isExperimentalHost(); this.enableDirectAccess = options.isEnableDirectAccess(); this.universeDomain = options.getUniverseDomain(); + this.grpcInterceptorProvider = options.getGrpcInterceptorProviderName(); } @Override @@ -229,7 +231,8 @@ public boolean equals(Object o) { && Objects.equals(this.clientCertificateKey, other.clientCertificateKey) && Objects.equals(this.isExperimentalHost, other.isExperimentalHost) && Objects.equals(this.enableDirectAccess, other.enableDirectAccess) - && Objects.equals(this.universeDomain, other.universeDomain); + && Objects.equals(this.universeDomain, other.universeDomain) + && Objects.equals(this.grpcInterceptorProvider, other.grpcInterceptorProvider); } @Override @@ -253,7 +256,8 @@ public int hashCode() { this.clientCertificateKey, this.isExperimentalHost, this.enableDirectAccess, - this.universeDomain); + this.universeDomain, + this.grpcInterceptorProvider); } } @@ -426,6 +430,9 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) { if (key.universeDomain != null) { builder.setUniverseDomain(key.universeDomain); } + if (key.grpcInterceptorProvider != null) { + builder.setInterceptorProvider(options.getGrpcInterceptorProvider()); + } if (options.getConfigurator() != null) { options.getConfigurator().configure(builder); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/GrpcInterceptorProviderTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/GrpcInterceptorProviderTest.java new file mode 100644 index 0000000000..0845d1d9c3 --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/GrpcInterceptorProviderTest.java @@ -0,0 +1,117 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.spanner.connection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import com.google.api.gax.grpc.GrpcInterceptorProvider; +import com.google.cloud.spanner.ErrorCode; +import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.SpannerException; +import com.google.common.collect.ImmutableList; +import io.grpc.CallOptions; +import io.grpc.Channel; +import io.grpc.ClientCall; +import io.grpc.ClientInterceptor; +import io.grpc.MethodDescriptor; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class GrpcInterceptorProviderTest extends AbstractMockServerTest { + private static final AtomicBoolean INTERCEPTOR_CALLED = new AtomicBoolean(false); + + public static final class TestGrpcInterceptorProvider implements GrpcInterceptorProvider { + @Override + public List getInterceptors() { + return ImmutableList.of( + new ClientInterceptor() { + @Override + public ClientCall interceptCall( + MethodDescriptor method, CallOptions callOptions, Channel next) { + INTERCEPTOR_CALLED.set(true); + return next.newCall(method, callOptions); + } + }); + } + } + + @Before + public void clearInterceptorUsedFlag() { + INTERCEPTOR_CALLED.set(false); + } + + @Test + public void testGrpcInterceptorProviderIsNotUsedByDefault() { + assertFalse(INTERCEPTOR_CALLED.get()); + try (Connection connection = createConnection()) { + try (ResultSet resultSet = connection.executeQuery(SELECT1_STATEMENT)) { + while (resultSet.next()) { + // ignore + } + } + } + assertFalse(INTERCEPTOR_CALLED.get()); + } + + @Test + public void testGrpcInterceptorProviderIsUsedWhenConfigured() { + System.setProperty("ENABLE_GRPC_INTERCEPTOR_PROVIDER", "true"); + assertFalse(INTERCEPTOR_CALLED.get()); + try (Connection connection = + createConnection( + ";grpc_interceptor_provider=" + TestGrpcInterceptorProvider.class.getName())) { + try (ResultSet resultSet = connection.executeQuery(SELECT1_STATEMENT)) { + while (resultSet.next()) { + // ignore + } + } + } finally { + System.clearProperty("ENABLE_GRPC_INTERCEPTOR_PROVIDER"); + } + assertTrue(INTERCEPTOR_CALLED.get()); + } + + @Test + public void testGrpcInterceptorProviderRequiresSystemProperty() { + assertFalse(INTERCEPTOR_CALLED.get()); + SpannerException exception = + assertThrows( + SpannerException.class, + () -> + createConnection( + ";grpc_interceptor_provider=" + TestGrpcInterceptorProvider.class.getName())); + assertEquals(ErrorCode.FAILED_PRECONDITION, exception.getErrorCode()); + assertTrue( + exception.getMessage(), + exception + .getMessage() + .contains( + "grpc_interceptor_provider can only be used if the system property" + + " ENABLE_GRPC_INTERCEPTOR_PROVIDER has been set to true. Start the" + + " application with the JVM command line option" + + " -DENABLE_GRPC_INTERCEPTOR_PROVIDER=true")); + assertFalse(INTERCEPTOR_CALLED.get()); + } +} From 8f91a894771653213b6fcded5795349ad7ea6724 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 16:47:47 +0100 Subject: [PATCH 22/34] deps: update dependency com.google.cloud:google-cloud-trace to v2.76.0 (#4148) --- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 83ef057473..96448c862e 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -23,7 +23,7 @@ 1.8 UTF-8 0.31.1 - 2.75.0 + 2.76.0 3.76.0 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 53c9153862..b93dd86ae5 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -23,7 +23,7 @@ 1.8 UTF-8 0.31.1 - 2.75.0 + 2.76.0 3.76.0 From d566a4295be018070169ba082a018394a2e60b45 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 17:07:22 +0100 Subject: [PATCH 23/34] deps: update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.76.0 (#4144) --- google-cloud-spanner-executor/pom.xml | 2 +- google-cloud-spanner/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index eb52d4a0b9..44e5368e16 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -137,7 +137,7 @@ com.google.api.grpc proto-google-cloud-trace-v1 - 2.75.0 + 2.76.0 com.google.api.grpc diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index f7d78e5e36..e2910d1fed 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -487,7 +487,7 @@ com.google.api.grpc proto-google-cloud-trace-v1 - 2.75.0 + 2.76.0 test From 4b1d4af19336e493af38a1e58c95786da3892d34 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 17:37:43 +0100 Subject: [PATCH 24/34] deps: update dependency com.google.cloud:google-cloud-trace to v2.76.0 (#4147) --- google-cloud-spanner-executor/pom.xml | 2 +- google-cloud-spanner/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index 44e5368e16..d67eb339d0 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -64,7 +64,7 @@ com.google.cloud google-cloud-trace - 2.75.0 + 2.76.0 io.grpc diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index e2910d1fed..4ccbc386e9 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -481,7 +481,7 @@ com.google.cloud google-cloud-trace - 2.75.0 + 2.76.0 test From 6c9dc26330cf66f196adc2203323a482e08f0325 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 17:49:40 +0100 Subject: [PATCH 25/34] deps: update dependency com.google.api.grpc:proto-google-cloud-monitoring-v3 to v3.77.0 (#4143) --- google-cloud-spanner/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 4ccbc386e9..b21fed399d 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -274,7 +274,7 @@ com.google.api.grpc proto-google-cloud-monitoring-v3 - 3.76.0 + 3.77.0 com.google.api.grpc From 65913ec0638fec4ea536cf42f8fe25460133f68e Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 17:59:22 +0100 Subject: [PATCH 26/34] deps: update googleapis/sdk-platform-java action to v2.62.3 (#4108) --- .github/workflows/hermetic_library_generation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 640f7bbd53..0e85f80524 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -37,7 +37,7 @@ jobs: with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} - - uses: googleapis/sdk-platform-java/.github/scripts@v2.62.2 + - uses: googleapis/sdk-platform-java/.github/scripts@v2.62.3 if: env.SHOULD_RUN == 'true' with: base_ref: ${{ github.base_ref }} From 14ebdb35c33442c4e0f70d63dce3425edb730525 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 18:12:51 +0100 Subject: [PATCH 27/34] deps: update actions/checkout action to v5 (#4106) --- .github/workflows/update_generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml index a7e14bb483..59e39834dd 100644 --- a/.github/workflows/update_generation_config.yaml +++ b/.github/workflows/update_generation_config.yaml @@ -26,7 +26,7 @@ jobs: # the branch into which the pull request is merged base_branch: main steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} From 7047a3ae31aae51e9e23758fe004b93855a0ee4b Mon Sep 17 00:00:00 2001 From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com> Date: Wed, 8 Oct 2025 13:13:30 -0400 Subject: [PATCH 28/34] chore: Update generation configuration at Wed Oct 8 02:26:38 UTC 2025 (#4101) * chore: Update generation configuration at Tue Sep 30 02:28:20 UTC 2025 * chore: generate libraries at Tue Sep 30 02:28:55 UTC 2025 * chore: Update generation configuration at Wed Oct 1 02:32:45 UTC 2025 * chore: Update generation configuration at Thu Oct 2 02:28:18 UTC 2025 * chore: Update generation configuration at Fri Oct 3 02:28:34 UTC 2025 * chore: generate libraries at Fri Oct 3 02:29:12 UTC 2025 * chore: Update generation configuration at Sat Oct 4 02:23:47 UTC 2025 * chore: Update generation configuration at Tue Oct 7 02:28:15 UTC 2025 * chore: Update generation configuration at Wed Oct 8 02:26:38 UTC 2025 --- .kokoro/presubmit/graalvm-native-a.cfg | 2 +- .kokoro/presubmit/graalvm-native-b.cfg | 2 +- .kokoro/presubmit/graalvm-native-c.cfg | 2 +- README.md | 2 +- generation_config.yaml | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg index 5554627daa..b7567eeb7d 100644 --- a/.kokoro/presubmit/graalvm-native-a.cfg +++ b/.kokoro/presubmit/graalvm-native-a.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.52.2" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.52.3" # {x-version-update:google-cloud-shared-dependencies:current} } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg index 1089437409..c7205f0abd 100644 --- a/.kokoro/presubmit/graalvm-native-b.cfg +++ b/.kokoro/presubmit/graalvm-native-b.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.52.2" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.52.3" # {x-version-update:google-cloud-shared-dependencies:current} } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native-c.cfg b/.kokoro/presubmit/graalvm-native-c.cfg index 5465e51923..f6ab8976a5 100644 --- a/.kokoro/presubmit/graalvm-native-c.cfg +++ b/.kokoro/presubmit/graalvm-native-c.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.52.2" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.52.3" # {x-version-update:google-cloud-shared-dependencies:current} } env_vars: { diff --git a/README.md b/README.md index 756f365131..6fc3af24e7 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ If you are using Maven without the BOM, add this to your dependencies: If you are using Gradle 5.x or later, add this to your dependencies: ```Groovy -implementation platform('com.google.cloud:libraries-bom:26.68.0') +implementation platform('com.google.cloud:libraries-bom:26.69.0') implementation 'com.google.cloud:google-cloud-spanner' ``` diff --git a/generation_config.yaml b/generation_config.yaml index ceefc9ceee..bdd59f3570 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,6 +1,6 @@ -gapic_generator_version: 2.62.2 -googleapis_commitish: 31b413bc4feb03f6849c718048c2b9998561b5fa -libraries_bom_version: 26.68.0 +gapic_generator_version: 2.62.3 +googleapis_commitish: d9a16f2feec3d0f03899e48007a02ce154fc919d +libraries_bom_version: 26.69.0 libraries: - api_shortname: spanner name_pretty: Cloud Spanner From c14a5d30aa134b0c5619d172300d917cdec208de Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 18:16:34 +0100 Subject: [PATCH 29/34] build(deps): update dependency org.codehaus.mojo:exec-maven-plugin to v3.6.1 (#4102) --- benchmarks/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 61a0fe6f1f..8de838926b 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -126,7 +126,7 @@ org.codehaus.mojo exec-maven-plugin - 3.5.1 + 3.6.1 com.google.cloud.spanner.benchmark.LatencyBenchmark false From 44ae6532f222a51c8ab936d03a0aea927d04d218 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 18:17:02 +0100 Subject: [PATCH 30/34] chore(deps): update dependency com.google.cloud:libraries-bom to v26.69.0 (#4100) --- samples/snippets/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 839ce261d5..5b2164f0cb 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -34,7 +34,7 @@ com.google.cloud libraries-bom - 26.68.0 + 26.69.0 pom import From 4ebea1adf726069084087ce46900f3174658055c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 19:39:19 +0100 Subject: [PATCH 31/34] deps: update dependency com.google.cloud:google-cloud-monitoring to v3.77.0 (#4146) --- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 96448c862e..a4efda2e16 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -24,7 +24,7 @@ UTF-8 0.31.1 2.76.0 - 3.76.0 + 3.77.0 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index b93dd86ae5..8f891b6df8 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -24,7 +24,7 @@ UTF-8 0.31.1 2.76.0 - 3.76.0 + 3.77.0 From 8917c054410e4035d6d4e201e43599d5ddc1fadd Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 20:21:52 +0100 Subject: [PATCH 32/34] deps: update dependency com.google.cloud:google-cloud-monitoring to v3.77.0 (#4145) --- benchmarks/pom.xml | 2 +- google-cloud-spanner/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 8de838926b..f27b1d7030 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -59,7 +59,7 @@ com.google.cloud google-cloud-monitoring - 3.76.0 + 3.77.0 diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index b21fed399d..4bbd9c5ba7 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -269,7 +269,7 @@ com.google.cloud google-cloud-monitoring - 3.76.0 + 3.77.0 com.google.api.grpc From 2451ca2abe1dd2de3907b88e8d18beab1a15a634 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Oct 2025 20:22:09 +0100 Subject: [PATCH 33/34] deps: update dependency com.google.api.grpc:grpc-google-cloud-monitoring-v3 to v3.77.0 (#4117) --- google-cloud-spanner/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 4bbd9c5ba7..a03220503b 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -279,7 +279,7 @@ com.google.api.grpc grpc-google-cloud-monitoring-v3 - 3.63.0 + 3.77.0 test From b967aaea0455084a81cac66494c303ca8d7f03c6 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:23:27 +0200 Subject: [PATCH 34/34] chore(main): release 6.102.0 (#4096) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 32 +++++++++++++++++++ benchmarks/pom.xml | 2 +- google-cloud-spanner-bom/pom.xml | 18 +++++------ google-cloud-spanner-executor/pom.xml | 4 +-- google-cloud-spanner/pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- grpc-google-cloud-spanner-executor-v1/pom.xml | 4 +-- grpc-google-cloud-spanner-v1/pom.xml | 4 +-- pom.xml | 20 ++++++------ .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- proto-google-cloud-spanner-v1/pom.xml | 4 +-- samples/snapshot/pom.xml | 2 +- versions.txt | 20 ++++++------ 16 files changed, 83 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56dd8b0ae4..7fd2983cfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [6.102.0](https://github.com/googleapis/java-spanner/compare/v6.101.1...v6.102.0) (2025-10-08) + + +### Features + +* Add connection property for gRPC interceptor provider ([#4149](https://github.com/googleapis/java-spanner/issues/4149)) ([deb8dff](https://github.com/googleapis/java-spanner/commit/deb8dff6c01c37a3158e8f4a28ef5e821d10092a)) +* Support statement_timeout in connection url ([#4103](https://github.com/googleapis/java-spanner/issues/4103)) ([542c6aa](https://github.com/googleapis/java-spanner/commit/542c6aa63bfdd526070f14cb76921dd34527c1f9)) + + +### Bug Fixes + +* Automatically set default_sequence_kind for CREATE SEQUENCE ([#4105](https://github.com/googleapis/java-spanner/issues/4105)) ([3beea6a](https://github.com/googleapis/java-spanner/commit/3beea6ac4eb53b70db34e0a2d2e33e56f450c88b)) +* **deps:** Update the Java code generator (gapic-generator-java) to 2.62.3 ([7047a3a](https://github.com/googleapis/java-spanner/commit/7047a3ae31aae51e9e23758fe004b93855a0ee4b)) + + +### Dependencies + +* Update actions/checkout action to v5 ([#4069](https://github.com/googleapis/java-spanner/issues/4069)) ([4c88eb9](https://github.com/googleapis/java-spanner/commit/4c88eb91a321aa718f957296012f9e7501c7caec)) +* Update actions/checkout action to v5 ([#4106](https://github.com/googleapis/java-spanner/issues/4106)) ([14ebdb3](https://github.com/googleapis/java-spanner/commit/14ebdb35c33442c4e0f70d63dce3425edb730525)) +* Update actions/setup-java action to v5 ([#4071](https://github.com/googleapis/java-spanner/issues/4071)) ([e23134a](https://github.com/googleapis/java-spanner/commit/e23134a2f864e8abd2890ac3a81ff6b668afbe63)) +* Update all dependencies ([#4099](https://github.com/googleapis/java-spanner/issues/4099)) ([b262edc](https://github.com/googleapis/java-spanner/commit/b262edcfc4713bb64986bc4acd3f02b69d3367f8)) +* Update dependency com.google.api.grpc:grpc-google-cloud-monitoring-v3 to v3.77.0 ([#4117](https://github.com/googleapis/java-spanner/issues/4117)) ([2451ca2](https://github.com/googleapis/java-spanner/commit/2451ca2abe1dd2de3907b88e8d18beab1a15a634)) +* Update dependency com.google.api.grpc:proto-google-cloud-monitoring-v3 to v3.77.0 ([#4143](https://github.com/googleapis/java-spanner/issues/4143)) ([6c9dc26](https://github.com/googleapis/java-spanner/commit/6c9dc26330cf66f196adc2203323a482e08f0325)) +* Update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.76.0 ([#4144](https://github.com/googleapis/java-spanner/issues/4144)) ([d566a42](https://github.com/googleapis/java-spanner/commit/d566a4295be018070169ba082a018394a2e60b45)) +* Update dependency com.google.cloud:google-cloud-monitoring to v3.77.0 ([#4145](https://github.com/googleapis/java-spanner/issues/4145)) ([8917c05](https://github.com/googleapis/java-spanner/commit/8917c054410e4035d6d4e201e43599d5ddc1fadd)) +* Update dependency com.google.cloud:google-cloud-monitoring to v3.77.0 ([#4146](https://github.com/googleapis/java-spanner/issues/4146)) ([4ebea1a](https://github.com/googleapis/java-spanner/commit/4ebea1adf726069084087ce46900f3174658055c)) +* Update dependency com.google.cloud:google-cloud-trace to v2.76.0 ([#4147](https://github.com/googleapis/java-spanner/issues/4147)) ([4b1d4af](https://github.com/googleapis/java-spanner/commit/4b1d4af19336e493af38a1e58c95786da3892d34)) +* Update dependency com.google.cloud:google-cloud-trace to v2.76.0 ([#4148](https://github.com/googleapis/java-spanner/issues/4148)) ([8f91a89](https://github.com/googleapis/java-spanner/commit/8f91a894771653213b6fcded5795349ad7ea6724)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.52.3 ([#4107](https://github.com/googleapis/java-spanner/issues/4107)) ([8a8a042](https://github.com/googleapis/java-spanner/commit/8a8a042494b092b3dddd0c9606a63197d8a23555)) +* Update dependency org.json:json to v20250517 ([#3881](https://github.com/googleapis/java-spanner/issues/3881)) ([5658c83](https://github.com/googleapis/java-spanner/commit/5658c8378aa2e8028d4ef7dfaf94b647f33cd812)) +* Update googleapis/sdk-platform-java action to v2.62.3 ([#4108](https://github.com/googleapis/java-spanner/issues/4108)) ([65913ec](https://github.com/googleapis/java-spanner/commit/65913ec0638fec4ea536cf42f8fe25460133f68e)) + ## [6.101.1](https://github.com/googleapis/java-spanner/compare/v6.101.0...v6.101.1) (2025-09-26) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index f27b1d7030..f976c0b4dd 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -24,7 +24,7 @@ com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index a5340ef48a..92de4f39b0 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.101.2-SNAPSHOT + 6.102.0 pom com.google.cloud @@ -53,43 +53,43 @@ com.google.cloud google-cloud-spanner - 6.101.2-SNAPSHOT + 6.102.0 com.google.cloud google-cloud-spanner test-jar - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index d67eb339d0..c9b0170a06 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -5,14 +5,14 @@ 4.0.0 com.google.cloud google-cloud-spanner-executor - 6.101.2-SNAPSHOT + 6.102.0 jar Google Cloud Spanner Executor com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index a03220503b..67f9a08602 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-spanner - 6.101.2-SNAPSHOT + 6.102.0 jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 google-cloud-spanner diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml index 7cc175b603..649a7b4226 100644 --- a/grpc-google-cloud-spanner-admin-database-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.101.2-SNAPSHOT + 6.102.0 grpc-google-cloud-spanner-admin-database-v1 GRPC library for grpc-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index fd5e3c4499..9d0e8cca71 100644 --- a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.101.2-SNAPSHOT + 6.102.0 grpc-google-cloud-spanner-admin-instance-v1 GRPC library for grpc-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/grpc-google-cloud-spanner-executor-v1/pom.xml b/grpc-google-cloud-spanner-executor-v1/pom.xml index 3b4172bb48..bba5a5cd4b 100644 --- a/grpc-google-cloud-spanner-executor-v1/pom.xml +++ b/grpc-google-cloud-spanner-executor-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.101.2-SNAPSHOT + 6.102.0 grpc-google-cloud-spanner-executor-v1 GRPC library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index 3d048e2c36..ebec943989 100644 --- a/grpc-google-cloud-spanner-v1/pom.xml +++ b/grpc-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.101.2-SNAPSHOT + 6.102.0 grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/pom.xml b/pom.xml index d80652fd1e..275fad8258 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 6.101.2-SNAPSHOT + 6.102.0 Google Cloud Spanner Parent https://github.com/googleapis/java-spanner @@ -61,47 +61,47 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.101.2-SNAPSHOT + 6.102.0 com.google.cloud google-cloud-spanner - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index 4529c9b4b4..1d6d70f6ee 100644 --- a/proto-google-cloud-spanner-admin-database-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-database-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.101.2-SNAPSHOT + 6.102.0 proto-google-cloud-spanner-admin-database-v1 PROTO library for proto-google-cloud-spanner-admin-database-v1 com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index 2f0cceeae3..66cba86dba 100644 --- a/proto-google-cloud-spanner-admin-instance-v1/pom.xml +++ b/proto-google-cloud-spanner-admin-instance-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.101.2-SNAPSHOT + 6.102.0 proto-google-cloud-spanner-admin-instance-v1 PROTO library for proto-google-cloud-spanner-admin-instance-v1 com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/proto-google-cloud-spanner-executor-v1/pom.xml b/proto-google-cloud-spanner-executor-v1/pom.xml index ceb7bc84ea..82f9dc550a 100644 --- a/proto-google-cloud-spanner-executor-v1/pom.xml +++ b/proto-google-cloud-spanner-executor-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.101.2-SNAPSHOT + 6.102.0 proto-google-cloud-spanner-executor-v1 Proto library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index 9373296dac..12e8c39d2e 100644 --- a/proto-google-cloud-spanner-v1/pom.xml +++ b/proto-google-cloud-spanner-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.101.2-SNAPSHOT + 6.102.0 proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 8f891b6df8..f94f84eb0b 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -32,7 +32,7 @@ com.google.cloud google-cloud-spanner - 6.101.2-SNAPSHOT + 6.102.0 diff --git a/versions.txt b/versions.txt index 08f012dbea..2ba0e25302 100644 --- a/versions.txt +++ b/versions.txt @@ -1,13 +1,13 @@ # Format: # module:released-version:current-version -proto-google-cloud-spanner-admin-instance-v1:6.101.1:6.101.2-SNAPSHOT -proto-google-cloud-spanner-v1:6.101.1:6.101.2-SNAPSHOT -proto-google-cloud-spanner-admin-database-v1:6.101.1:6.101.2-SNAPSHOT -grpc-google-cloud-spanner-v1:6.101.1:6.101.2-SNAPSHOT -grpc-google-cloud-spanner-admin-instance-v1:6.101.1:6.101.2-SNAPSHOT -grpc-google-cloud-spanner-admin-database-v1:6.101.1:6.101.2-SNAPSHOT -google-cloud-spanner:6.101.1:6.101.2-SNAPSHOT -google-cloud-spanner-executor:6.101.1:6.101.2-SNAPSHOT -proto-google-cloud-spanner-executor-v1:6.101.1:6.101.2-SNAPSHOT -grpc-google-cloud-spanner-executor-v1:6.101.1:6.101.2-SNAPSHOT +proto-google-cloud-spanner-admin-instance-v1:6.102.0:6.102.0 +proto-google-cloud-spanner-v1:6.102.0:6.102.0 +proto-google-cloud-spanner-admin-database-v1:6.102.0:6.102.0 +grpc-google-cloud-spanner-v1:6.102.0:6.102.0 +grpc-google-cloud-spanner-admin-instance-v1:6.102.0:6.102.0 +grpc-google-cloud-spanner-admin-database-v1:6.102.0:6.102.0 +google-cloud-spanner:6.102.0:6.102.0 +google-cloud-spanner-executor:6.102.0:6.102.0 +proto-google-cloud-spanner-executor-v1:6.102.0:6.102.0 +grpc-google-cloud-spanner-executor-v1:6.102.0:6.102.0