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 73f923590a2..c0eb12946ef 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 47598f1c644..67cfbf5ba5c 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 33e46772741..1815eca131d 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 edabbdac620..b359836c55b 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 9bb87093155..6cf9bcb8bf8 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 a89656fcfcc..7cc175b6039 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 c5e56e818d4..fd5e3c44990 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 f1439226386..3b4172bb485 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 0e2812e71f1..3d048e2c36b 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 3ed2cc20b57..091117e06fd 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 af692c6a4dc..4529c9b4b4b 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 2b129d2faf9..2f0cceeae37 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 557343a2e32..ceb7bc84ea8 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 4acd5bf6125..9373296dacb 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 b8d534a4c8c..b8ffa1d9cbd 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 ee56d9a1578..08f012dbea8 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 f1a9a7ababf..ceefc9ceee2 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 06e7e416d92..3d64f419093 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 f4ac97a8fe5..a9f5e46ca36 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 e646d4e2c24..11dc247ab08 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 e24840bbb8c..1f0d870870f 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 b8ffa1d9cbd..f35a4f37f41 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 67cfbf5ba5c..49f456ad9c8 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 1815eca131d..9996e9c9646 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 091117e06fd..0416378525b 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 b359836c55b..658239ede6f 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 1f0d870870f..d13e81bafc4 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 f35a4f37f41..659f74b6756 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 25be82edd80..22c6400079d 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 658239ede6f..ef98adadfbd 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 0416378525b..709572d7dbb 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 d13e81bafc4..01c17d82e81 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 659f74b6756..086a767845b 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 22c6400079d..839ce261d56 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 49f456ad9c8..b47919cd776 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 01c17d82e81..f8b4ef71d70 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 18d92e5a28d..0cda6b04f72 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 6d1265ec78f..640f7bbd531 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 3d64f419093..371620cf5a6 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 a9f5e46ca36..cd677dd1a6a 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 11dc247ab08..b14cc4f3869 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 c0eb12946ef..756f365131c 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 b47919cd776..61a0fe6f1f0 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 ef98adadfbd..eb52d4a0b9c 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 6cf9bcb8bf8..62e231394d5 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 f8b4ef71d70..83ef0574733 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 086a767845b..53c9153862e 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 a7e14bb483c..59e39834dd0 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 dbefb732947..76b5436aba9 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 62e231394d5..965991b346f 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 59e39834dd0..a7e14bb483c 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 f153cf6fe4f..80e0ac7efaa 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 8ae4c0fc5fd..07ded59d85f 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 3bb5d71e485..ae64f44ebce 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 e9af95d9de0..18fd5cb6143 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 b1adb3861bc..e854b3d9d90 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 965991b346f..f7d78e5e36f 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 40202a0eefe..bedf6600075 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 af4ed58bad1..765114dc68d 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 00000000000..225197af6c1 --- /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 00000000000..aaa73876125 --- /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 00000000000..eed461fc897 --- /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 00000000000..7753f173ee0 --- /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 8717db17ae5..e2e6881c783 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 b14cc4f3869..6040b5ceee1 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 9996e9c9646..a5340ef48a7 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 709572d7dbb..d80652fd1e9 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 8f5baca64f6..34fad2a69c9 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 57916aae580..3d796af4f00 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 b12cd21fa78..741989ff5b7 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 ae64f44ebce..200de9bec87 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 c1cf3ae6790..e78a646f070 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 00000000000..0845d1d9c36 --- /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 83ef0574733..96448c862ee 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 53c9153862e..b93dd86ae57 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 eb52d4a0b9c..44e5368e163 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 f7d78e5e36f..e2910d1fed4 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 44e5368e163..d67eb339d07 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 e2910d1fed4..4ccbc386e9a 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 4ccbc386e9a..b21fed399d0 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 640f7bbd531..0e85f80524f 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 a7e14bb483c..59e39834dd0 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 5554627daa9..b7567eeb7dd 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 1089437409e..c7205f0abd4 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 5465e51923e..f6ab8976a57 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 756f365131c..6fc3af24e73 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 ceefc9ceee2..bdd59f35704 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 61a0fe6f1f0..8de838926bb 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 839ce261d56..5b2164f0cb6 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 96448c862ee..a4efda2e169 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 b93dd86ae57..8f891b6df87 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 8de838926bb..f27b1d7030c 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 b21fed399d0..4bbd9c5ba7e 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 4bbd9c5ba7e..a03220503b4 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 56dd8b0ae44..7fd2983cfad 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 f27b1d7030c..f976c0b4ddc 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 a5340ef48a7..92de4f39b0b 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 d67eb339d07..c9b0170a064 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 a03220503b4..67f9a086028 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 7cc175b6039..649a7b4226c 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 fd5e3c44990..9d0e8cca715 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 3b4172bb485..bba5a5cd4bf 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 3d048e2c36b..ebec943989f 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 d80652fd1e9..275fad8258d 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 4529c9b4b4b..1d6d70f6ee0 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 2f0cceeae37..66cba86dba5 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 ceb7bc84ea8..82f9dc550a4 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 9373296dacb..12e8c39d2ee 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 8f891b6df87..f94f84eb0b5 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 08f012dbea8..2ba0e25302a 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