From b648f2dae6d311fee411c1cf2b04d24748fc6034 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 12 May 2025 06:41:47 +0200 Subject: [PATCH 01/25] chore(deps): update dependency com.google.cloud:google-cloud-spanner to v6.92.0 (#3859) Co-authored-by: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> --- 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 f9d4779c5f..f7de77d6d9 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -92,7 +92,7 @@ com.google.cloud google-cloud-spanner - 6.89.0 + 6.92.0 commons-cli diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 10457c70ef..0d01f4185d 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.89.0 + 6.92.0 From d430a0ffa40c888f9ef68f58157010b3f9a40f16 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 12 May 2025 06:42:04 +0200 Subject: [PATCH 02/25] build(deps): update dependency org.jacoco:jacoco-maven-plugin to v0.8.13 (#3856) --- 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 dc1116da57..92e047813a 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -28,7 +28,7 @@ org.jacoco jacoco-maven-plugin - 0.8.12 + 0.8.13 From 335f4efafc0add2595104855bfdc5bd8daca3547 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 12 May 2025 07:07:49 +0200 Subject: [PATCH 03/25] chore(deps): update dependency com.google.cloud:libraries-bom to v26.60.0 (#3860) --- 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 fa7df05da0..2769859850 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -34,7 +34,7 @@ com.google.cloud libraries-bom - 26.57.0 + 26.60.0 pom import From 283f5bf6a53441a64eaa781baaac5690ae957bf7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 12 May 2025 07:20:38 +0200 Subject: [PATCH 04/25] chore(deps): update dependency com.google.cloud:google-cloud-spanner to v6.93.0 (#3867) --- 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 f7de77d6d9..28c77f3b6b 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -92,7 +92,7 @@ com.google.cloud google-cloud-spanner - 6.92.0 + 6.93.0 commons-cli diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 0d01f4185d..51fed236a6 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.92.0 + 6.93.0 From 035cadd5bb77a8f9f6fb25ac8c8e5a3e186d9a22 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> Date: Mon, 12 May 2025 22:00:00 +0530 Subject: [PATCH 05/25] docs: Add samples for unnamed (positional) parameters (#3849) * chore: Add samples for unnamed(or positional) parameters * chore: generate libraries at Mon May 12 05:24:29 UTC 2025 * Fix failing tests --------- Co-authored-by: cloud-java-bot --- .kokoro/presubmit/samples.cfg | 38 +++++++++ README.md | 5 +- .../spanner/DatabaseAddSplitPointsSample.java | 12 +-- .../spanner/UnnamedParametersExample.java | 84 +++++++++++++++++++ .../example/spanner/UnnamedParametersIT.java | 61 ++++++++++++++ 5 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 .kokoro/presubmit/samples.cfg create mode 100644 samples/snippets/src/main/java/com/example/spanner/UnnamedParametersExample.java create mode 100644 samples/snippets/src/test/java/com/example/spanner/UnnamedParametersIT.java diff --git a/.kokoro/presubmit/samples.cfg b/.kokoro/presubmit/samples.cfg new file mode 100644 index 0000000000..2cabe201bc --- /dev/null +++ b/.kokoro/presubmit/samples.cfg @@ -0,0 +1,38 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "samples" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} + +env_vars: { + key: "ENABLE_BUILD_COP" + value: "true" +} diff --git a/README.md b/README.md index 165cf6ed2d..24a1a9ca4c 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.57.0 + 26.60.0 pom import @@ -41,7 +41,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-spanner - 6.89.0 + 6.93.0 ``` @@ -575,6 +575,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-spanner/tree/ | Tag Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/TagSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/TagSample.java) | | Tracing Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/TracingSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/TracingSample.java) | | Transaction Timeout Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/TransactionTimeoutExample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/TransactionTimeoutExample.java) | +| Unnamed Parameters Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UnnamedParametersExample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/UnnamedParametersExample.java) | | Update Backup Schedule Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateBackupScheduleSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/UpdateBackupScheduleSample.java) | | Update Database Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateDatabaseSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/UpdateDatabaseSample.java) | | Update Database With Default Leader Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateDatabaseWithDefaultLeaderSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-spanner&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/spanner/UpdateDatabaseWithDefaultLeaderSample.java) | diff --git a/samples/snippets/src/main/java/com/example/spanner/DatabaseAddSplitPointsSample.java b/samples/snippets/src/main/java/com/example/spanner/DatabaseAddSplitPointsSample.java index 05c650dbfb..390ac6c3b2 100644 --- a/samples/snippets/src/main/java/com/example/spanner/DatabaseAddSplitPointsSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/DatabaseAddSplitPointsSample.java @@ -66,8 +66,7 @@ static void addSplitPoints(String projectId, String instanceId, String databaseI com.google.spanner.admin.database.v1.SplitPoints splitPointForTable = SplitPoints.newBuilder() .setTable("Singers") - .setKeys( - 0, + .addKeys( com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder() .setKeyParts( ListValue.newBuilder() @@ -79,8 +78,7 @@ static void addSplitPoints(String projectId, String instanceId, String databaseI com.google.spanner.admin.database.v1.SplitPoints splitPointForIndex = SplitPoints.newBuilder() .setIndex("SingersByFirstLastName") - .setKeys( - 0, + .addKeys( com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder() .setKeyParts( ListValue.newBuilder() @@ -93,16 +91,14 @@ static void addSplitPoints(String projectId, String instanceId, String databaseI com.google.spanner.admin.database.v1.SplitPoints splitPointForIndexWitTableKey = SplitPoints.newBuilder() .setIndex("SingersByFirstLastName") - .setKeys( - 0, + .addKeys( com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder() .setKeyParts( ListValue.newBuilder() .addValues(Value.newBuilder().setStringValue("Jane").build()) .addValues(Value.newBuilder().setStringValue("Doe").build()) .build())) - .setKeys( - 1, + .addKeys( com.google.spanner.admin.database.v1.SplitPoints.Key.newBuilder() .setKeyParts( ListValue.newBuilder() diff --git a/samples/snippets/src/main/java/com/example/spanner/UnnamedParametersExample.java b/samples/snippets/src/main/java/com/example/spanner/UnnamedParametersExample.java new file mode 100644 index 0000000000..3c73a7591d --- /dev/null +++ b/samples/snippets/src/main/java/com/example/spanner/UnnamedParametersExample.java @@ -0,0 +1,84 @@ +/* + * 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.example.spanner; + +import com.google.cloud.Timestamp; +import com.google.cloud.spanner.DatabaseClient; +import com.google.cloud.spanner.DatabaseId; +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.cloud.spanner.Statement.StatementFactory; +import java.time.LocalDate; + +public class UnnamedParametersExample { + + static void executeQueryWithUnnamedParameters() { + // TODO(developer): Replace these variables before running the sample. + String projectId = "my-project"; + String instanceId = "my-instance"; + String databaseId = "my-database"; + + executeQueryWithUnnamedParameters(projectId, instanceId, databaseId); + } + + static void executeQueryWithUnnamedParameters( + String projectId, String instanceId, String databaseId) { + try (Spanner spanner = + SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) { + + DatabaseClient client = + spanner.getDatabaseClient(DatabaseId.of(projectId, instanceId, databaseId)); + StatementFactory statementFactory = client.getStatementFactory(); + + // Insert a row with unnamed parameters + client + .readWriteTransaction() + .run( + transaction -> { + Statement statement = statementFactory + .withUnnamedParameters("INSERT INTO Students(StudentId, Name, IsNRI, AvgMarks, " + + "JoinedAt, PinCode, CreatedAt) VALUES(?, ?, ?, ?, ?, ?, ?)", + 1000001, + "Google", + false, + (float) 34.5, + LocalDate.of(2024, 3, 31), + "123456", + Timestamp.now()); + transaction.executeUpdate(statement); + + return null; + }); + System.out.println("Row is inserted."); + + // Query the table with unnamed parameters + try (ResultSet resultSet = + client + .singleUse() + .executeQuery( + statementFactory.withUnnamedParameters( + "SELECT * FROM Students WHERE StudentId = ?", 1000001))) { + while (resultSet.next()) { + System.out.println(resultSet.getString("Name")); + } + } + System.out.println("Row is fetched."); + } + } +} diff --git a/samples/snippets/src/test/java/com/example/spanner/UnnamedParametersIT.java b/samples/snippets/src/test/java/com/example/spanner/UnnamedParametersIT.java new file mode 100644 index 0000000000..d6c900dd60 --- /dev/null +++ b/samples/snippets/src/test/java/com/example/spanner/UnnamedParametersIT.java @@ -0,0 +1,61 @@ +/* + * 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.example.spanner; + +import static org.junit.Assert.assertTrue; + +import com.google.cloud.spanner.DatabaseId; +import com.google.common.collect.ImmutableList; +import java.util.concurrent.ExecutionException; +import org.junit.Before; +import org.junit.Test; + +public class UnnamedParametersIT extends SampleTestBase { + private static String databaseId; + + @Before + public void setup() throws ExecutionException, InterruptedException { + databaseId = idGenerator.generateDatabaseId(); + databaseAdminClient + .createDatabase( + databaseAdminClient + .newDatabaseBuilder(DatabaseId.of(projectId, instanceId, databaseId)) + .build(), + ImmutableList.of( + "CREATE TABLE Students (" + + " StudentId INT64 NOT NULL PRIMARY KEY," + + " Name STRING(1024) NOT NULL," + + " IsNRI BOOL NOT NULL," + + " AvgMarks FLOAT32 NOT NULL," + + " JoinedAt DATE NOT NULL," + + " PinCode INT64 NOT NULL," + + " CreatedAt TIMESTAMP NOT NULL" + + ")")) + .get(); + } + + @Test + public void testUnnamedParameters() throws Exception { + final String out = + SampleRunner.runSample( + () -> UnnamedParametersExample.executeQueryWithUnnamedParameters(projectId, instanceId, + databaseId)); + assertTrue(out.contains("Row is inserted.")); + assertTrue(out.contains("Google")); + assertTrue(out.contains("Row is fetched.")); + } +} From 205713c09403c2c57540d443ba55a1a773dd3618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 13 May 2025 17:02:00 +0200 Subject: [PATCH 06/25] chore: make StatementExecutorType public (#3868) Make the getter/setter for StatementExecutorType public, so these can be set by the JDBC driver and PGAdapter. --- .../spanner/connection/ConnectionOptions.java | 12 ++++++++++-- .../spanner/connection/StatementExecutor.java | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) 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 9811a94620..58b2c78fb2 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 @@ -556,7 +556,11 @@ Builder setCredentials(Credentials credentials) { return this; } - Builder setStatementExecutorType(StatementExecutorType statementExecutorType) { + /** + * Sets the executor type to use for connections. See {@link StatementExecutorType} for more + * information on what the different options mean. + */ + public Builder setStatementExecutorType(StatementExecutorType statementExecutorType) { this.statementExecutorType = statementExecutorType; return this; } @@ -920,7 +924,11 @@ CredentialsProvider getCredentialsProvider() { return getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER); } - StatementExecutorType getStatementExecutorType() { + /** + * Returns the executor type that is used by connections that are created from this {@link + * ConnectionOptions} instance. + */ + public StatementExecutorType getStatementExecutorType() { return this.statementExecutorType; } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementExecutor.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementExecutor.java index 6e410f31e8..b022158b91 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementExecutor.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/StatementExecutor.java @@ -172,9 +172,23 @@ private static ListeningExecutorService createExecutorService(StatementExecutorT */ private final List interceptors; - enum StatementExecutorType { + /** The executor type that is used for statements that are executed on a connection. */ + public enum StatementExecutorType { + /** + * Use a platform thread per connection. This allows async execution of statements, but costs + * more resources than the other options. + */ PLATFORM_THREAD, + /** + * Use a virtual thread per connection. This allows async execution of statements. Virtual + * threads are only supported on Java 21 and higher. + */ VIRTUAL_THREAD, + /** + * Use the calling thread for execution. This does not support async execution of statements. + * This option is used by drivers that do not support async execution, such as JDBC and + * PGAdapter. + */ DIRECT_EXECUTOR, } From d1e45fa88bb005529bcfb2a6ff2df44065be0fd2 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 15 May 2025 10:25:35 +0200 Subject: [PATCH 07/25] deps: update googleapis/sdk-platform-java action to v2.58.0 (#3870) --- .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 f0b1369c88..336ac2c8ca 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.57.0 + - uses: googleapis/sdk-platform-java/.github/scripts@v2.58.0 if: env.SHOULD_RUN == 'true' with: base_ref: ${{ github.base_ref }} From f7e09b8148c0e51503255694bd3347c637724b34 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 15 May 2025 10:26:05 +0200 Subject: [PATCH 08/25] deps: update opentelemetry.version to v1.50.0 (#3866) Co-authored-by: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> --- benchmarks/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 28c77f3b6b..1c69bf9028 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -34,7 +34,7 @@ UTF-8 UTF-8 2.10.1 - 1.49.0 + 1.50.0 From afa17f73beab80639467916bc73b5c96305093aa Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 15 May 2025 10:27:21 +0200 Subject: [PATCH 09/25] deps: update dependency com.google.cloud:sdk-platform-java-config to v3.48.0 (#3869) --- .github/workflows/unmanaged_dependency_check.yaml | 2 +- .kokoro/presubmit/graalvm-native-a.cfg | 2 +- .kokoro/presubmit/graalvm-native-b.cfg | 2 +- .kokoro/presubmit/graalvm-native-c.cfg | 2 +- google-cloud-spanner-bom/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 5663b4b2fe..1579829ae2 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.47.0 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.48.0 with: bom-path: google-cloud-spanner-bom/pom.xml diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg index 24e5053a5b..d72ed3f0e3 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.47.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.48.0" # {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 ae35f6cb21..f2e296b847 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.47.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.48.0" # {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 660f1ee7ea..68512fbff5 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.47.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.48.0" # {x-version-update:google-cloud-shared-dependencies:current} } env_vars: { diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index de163ff66e..e31878a512 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.47.0 + 3.48.0 Google Cloud Spanner BOM diff --git a/pom.xml b/pom.xml index 24ef30ec9d..e2079b2cbe 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.47.0 + 3.48.0 From 5cdf4328db2b9a6b0feb2482501d2323c5d81555 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 15 May 2025 10:29:34 +0200 Subject: [PATCH 10/25] build(deps): update dependency org.apache.maven.plugins:maven-project-info-reports-plugin to v3.9.0 (#3858) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2079b2cbe..7c3f2a1901 100644 --- a/pom.xml +++ b/pom.xml @@ -171,7 +171,7 @@ org.apache.maven.plugins maven-project-info-reports-plugin - 3.8.0 + 3.9.0 From 80a6af836ca29ec196a2f509831e1d36c557168f Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 15 May 2025 12:21:47 +0200 Subject: [PATCH 11/25] deps: update dependency commons-io:commons-io to v2.19.0 (#3863) Co-authored-by: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> --- 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 20102f3598..7908421b97 100644 --- a/google-cloud-spanner-executor/pom.xml +++ b/google-cloud-spanner-executor/pom.xml @@ -175,7 +175,7 @@ commons-io commons-io - 2.18.0 + 2.19.0 From 676b14f916dea783b40ddec4061bd7af157b5d98 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 15 May 2025 12:23:04 +0200 Subject: [PATCH 12/25] deps: update dependency com.google.cloud.opentelemetry:exporter-metrics to v0.34.0 (#3861) Co-authored-by: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> --- benchmarks/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 1c69bf9028..2799b92806 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -54,7 +54,7 @@ com.google.cloud.opentelemetry exporter-metrics - 0.33.0 + 0.34.0 From 69b58e75477a8ed440bfae106d3272ec2294857f Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 16 May 2025 10:36:46 +0200 Subject: [PATCH 13/25] build(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.14.0 (#3857) Co-authored-by: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> --- 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 e31878a512..93d7f92ee0 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.13.0 + 3.14.0 1.8 1.8 diff --git a/pom.xml b/pom.xml index 7c3f2a1901..20e68e08c0 100644 --- a/pom.xml +++ b/pom.xml @@ -153,7 +153,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 1.8 1.8 From ae6305089b394be0c1eaf8ff7e188711288d87ad Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 16 May 2025 10:37:49 +0200 Subject: [PATCH 14/25] deps: update dependency io.opentelemetry:opentelemetry-bom to v1.50.0 (#3865) Co-authored-by: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> --- benchmarks/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 2799b92806..28fef176cc 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -85,7 +85,7 @@ io.opentelemetry opentelemetry-bom - 1.46.0 + 1.50.0 pom import From 6317402e1d3c7d3e5da0c3bc83a14039f739c740 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> Date: Fri, 16 May 2025 14:08:42 +0530 Subject: [PATCH 15/25] ci: Fix UUID tests which is failing in cloud-devel (#3871) * ci: Fix UUID tests which is failing in cloud-devel * chore: generate libraries at Thu May 15 10:14:08 UTC 2025 --------- Co-authored-by: cloud-java-bot --- .kokoro/presubmit/graalvm-native-a.cfg | 2 +- .kokoro/presubmit/graalvm-native-b.cfg | 2 +- .kokoro/presubmit/graalvm-native-c.cfg | 2 +- .../src/test/java/com/google/cloud/spanner/it/ITUuidTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg index d72ed3f0e3..24e5053a5b 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.48.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.47.0" # {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 f2e296b847..ae35f6cb21 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.48.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.47.0" # {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 68512fbff5..660f1ee7ea 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.48.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.47.0" # {x-version-update:google-cloud-shared-dependencies:current} } env_vars: { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITUuidTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITUuidTest.java index 17e6369bf0..561602abfe 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITUuidTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITUuidTest.java @@ -399,7 +399,7 @@ public void uuidAsKeyParameter() { return null; }); - verifyKeyContents(Arrays.asList(uuid1, uuid2)); + verifyKeyContents(Arrays.asList(uuid2, uuid1)); } private void verifyKeyContents(List uuids) { From ca3a67db715f398943382df1f8a9979905811ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Fri, 16 May 2025 15:18:27 +0200 Subject: [PATCH 16/25] fix: remove trailing semicolons in DDL (#3879) The Connection API should automatically remove any trailing semicolons in DDL statements. Spanner accepts trailing semicolons in queries and DML statements, but not in DDL statements. Previously, the Connection API would remove all comments and trailing semicolons from DDL statements. Comments are now supported in DDL statements, and are therefore no longer removed by the Conneciton API, but that change also unintentionally kept any trailing semicolons in the SQL string that is sent to Spanner. Fixes https://togithub.com/cloudspannerecosystem/liquibase-spanner/issues/481 --- .../cloud/spanner/connection/DdlClient.java | 17 +++++++- .../cloud/spanner/connection/DdlTest.java | 43 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlClient.java index ef7ad7e5cd..d8dcb3c6ae 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DdlClient.java @@ -35,6 +35,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Supplier; +import java.util.stream.Collectors; /** * Convenience class for executing Data Definition Language statements on transactions that support @@ -137,7 +138,21 @@ OperationFuture executeDdl( dbBuilder.setProtoDescriptors(protoDescriptors); } Database db = dbBuilder.build(); - return dbAdminClient.updateDatabaseDdl(db, statements, null); + return dbAdminClient.updateDatabaseDdl( + db, + statements.stream().map(DdlClient::stripTrailingSemicolon).collect(Collectors.toList()), + null); + } + + static String stripTrailingSemicolon(String input) { + if (!input.contains(";")) { + return input; + } + String trimmed = input.trim(); + if (trimmed.endsWith(";")) { + return trimmed.substring(0, trimmed.length() - 1); + } + return input; } /** Returns true if the statement is a `CREATE DATABASE ...` statement. */ diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java index e71b912233..3585421e32 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/DdlTest.java @@ -364,4 +364,47 @@ public void testSetsDefaultSequenceKindAndRetriesBatch() { "create table bar (id2 int64 auto_increment primary key", ((UpdateDatabaseDdlRequest) requests.get(0)).getStatements(1)); } + + @Test + public void testStripTrailingSemicolon() { + addUpdateDdlResponse(); + addUpdateDdlResponse(); + addUpdateDdlResponse(); + addUpdateDdlResponse(); + try (Connection connection = createConnection()) { + connection.execute(Statement.of("drop table foo;")); + connection.execute(Statement.of("drop table foo \n\t;\n\t ")); + connection.execute(Statement.of("drop table foo")); + + connection.startBatchDdl(); + connection.execute(Statement.of("create table foo (id1 int64 auto_increment primary key;")); + connection.execute( + Statement.of("create table foo (id1 int64 auto_increment primary key \n\t;\n\t ")); + connection.execute(Statement.of("create table foo (id2 int64 auto_increment primary key")); + connection.runBatch(); + } + assertEquals(4, mockDatabaseAdmin.getRequests().size()); + assertEquals( + "drop table foo", + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(0)).getStatements(0)); + assertEquals( + "drop table foo \n\t", + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(1)).getStatements(0)); + assertEquals( + "drop table foo", + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(2)).getStatements(0)); + + assertEquals( + 3, + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(3)).getStatementsCount()); + assertEquals( + "create table foo (id1 int64 auto_increment primary key", + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(3)).getStatements(0)); + assertEquals( + "create table foo (id1 int64 auto_increment primary key \n\t", + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(3)).getStatements(1)); + assertEquals( + "create table foo (id2 int64 auto_increment primary key", + ((UpdateDatabaseDdlRequest) mockDatabaseAdmin.getRequests().get(3)).getStatements(2)); + } } From 1c93a3d1718431880efd07878e96ef9795a0f928 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> Date: Tue, 20 May 2025 15:14:16 +0530 Subject: [PATCH 17/25] chore: update benchmarking script (#3882) --- benchmarks/pom.xml | 19 +-- .../spanner/benchmark/AbstractRunner.java | 91 +++++++++--- .../spanner/benchmark/BenchmarkRunner.java | 17 ++- .../benchmark/BenchmarkingConfiguration.java | 115 +++++++++++++++ .../spanner/benchmark/JavaClientRunner.java | 137 +++++++++++------- .../spanner/benchmark/LatencyBenchmark.java | 74 +++++++--- 6 files changed, 341 insertions(+), 112 deletions(-) create mode 100644 benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkingConfiguration.java diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 28fef176cc..0abf037b8c 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -34,7 +34,7 @@ UTF-8 UTF-8 2.10.1 - 1.50.0 + 1.47.0 @@ -54,7 +54,12 @@ com.google.cloud.opentelemetry exporter-metrics - 0.34.0 + 0.33.0 + + + com.google.cloud + google-cloud-monitoring + 3.63.0 @@ -85,7 +90,7 @@ io.opentelemetry opentelemetry-bom - 1.50.0 + 1.47.0 pom import @@ -94,11 +99,6 @@ google-cloud-spanner 6.93.0 - - commons-cli - commons-cli - 1.9.0 - com.google.auto.value auto-value-annotations @@ -140,8 +140,9 @@ - com.coveo + com.spotify.fmt fmt-maven-plugin + 2.27 diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/AbstractRunner.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/AbstractRunner.java index 7646089129..b233cedaf2 100644 --- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/AbstractRunner.java +++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/AbstractRunner.java @@ -18,46 +18,80 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicInteger; abstract class AbstractRunner implements BenchmarkRunner { - static final int TOTAL_RECORDS = 1000000; - static final String SELECT_QUERY = "SELECT ID FROM FOO WHERE ID = @id"; - static final String UPDATE_QUERY = "UPDATE FOO SET BAR=1 WHERE ID = @id"; + static final int TOTAL_RECORDS = 100000; + static final String TABLE_NAME = "Employees"; + static final String SELECT_QUERY = String.format("SELECT ID FROM %s WHERE ID = @id", TABLE_NAME); + static final String UPDATE_QUERY = + String.format("UPDATE %s SET Name=Google WHERE ID = @id", TABLE_NAME); static final String ID_COLUMN_NAME = "id"; - static final String SERVER_URL = "https://staging-wrenchworks.sandbox.googleapis.com"; + static final Map SERVER_URL_MAPPING = new HashMap<>(); - private final AtomicInteger operationCounter = new AtomicInteger(); + static { + SERVER_URL_MAPPING.put( + Environment.CLOUD_DEVEL, "https://staging-wrenchworks.sandbox.googleapis.com"); + SERVER_URL_MAPPING.put(Environment.PROD, "https://spanner.googleapis.com"); + } + + Map timerConfigurations = new HashMap<>(); + private final Set completedClients = new HashSet<>(); + private final Set finishedClients = new HashSet<>(); + + protected void initiateTimer(int clientId, String message, Instant endTime) { + TimerConfiguration timerConfiguration = + timerConfigurations.getOrDefault(clientId, new TimerConfiguration()); + timerConfiguration.setMessage(message); + timerConfiguration.setEndTime(endTime); + timerConfigurations.put(clientId, timerConfiguration); + } - protected void incOperations() { - operationCounter.incrementAndGet(); + protected void setBenchmarkingCompleted(int clientId) { + this.completedClients.add(clientId); } protected List collectResults( ExecutorService service, List>> results, - int numClients, - int numOperations) + BenchmarkingConfiguration configuration) throws Exception { - int totalOperations = numClients * numOperations; + while (!(finishedClients.size() == configuration.getNumOfClients())) + for (int i = 0; i < configuration.getNumOfClients(); i++) { + TimerConfiguration timerConfiguration = + timerConfigurations.getOrDefault(i, new TimerConfiguration()); + long totalSeconds = + ChronoUnit.SECONDS.between(Instant.now(), timerConfiguration.getEndTime()); + if (completedClients.contains(i)) { + if (!finishedClients.contains(i)) { + System.out.printf("Client %s: Completed", i); + finishedClients.add(i); + } + } else { + System.out.printf( + "Client %s: %s %s Minutes %s Seconds\r", + i + 1, timerConfiguration.getMessage(), totalSeconds / 60, totalSeconds % 60); + } + //noinspection BusyWait + Thread.sleep(1000L); + } service.shutdown(); - while (!service.isTerminated()) { - //noinspection BusyWait - Thread.sleep(1000L); - System.out.printf("\r%d/%d", operationCounter.get(), totalOperations); - } - System.out.println(); if (!service.awaitTermination(60L, TimeUnit.MINUTES)) { throw new TimeoutException(); } - List allResults = new ArrayList<>(numClients * numOperations); + List allResults = new ArrayList<>(); for (Future> result : results) { allResults.addAll(result.get()); } @@ -77,4 +111,25 @@ protected String generateRandomString() { ThreadLocalRandom.current().nextBytes(bytes); return new String(bytes, StandardCharsets.UTF_8); } + + static class TimerConfiguration { + private Instant endTime = Instant.now(); + private String message = "Waiting for benchmarks to start..."; + + Instant getEndTime() { + return endTime; + } + + void setEndTime(Instant endTime) { + this.endTime = endTime; + } + + String getMessage() { + return message; + } + + void setMessage(String message) { + this.message = message; + } + } } diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java index 7a731887a8..4f8a77c3a1 100644 --- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java +++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java @@ -19,17 +19,18 @@ import java.time.Duration; import java.util.List; -public interface BenchmarkRunner { +interface BenchmarkRunner { enum TransactionType { - READ_ONLY_SINGLE_USE, + READ_ONLY_SINGLE_USE_READ, + READ_ONLY_SINGLE_USE_QUERY, READ_ONLY_MULTI_USE, READ_WRITE } - List execute( - TransactionType transactionType, - int numClients, - int numOperations, - int waitMillis, - boolean useMultiplexedSession); + enum Environment { + PROD, + CLOUD_DEVEL + } + + List execute(BenchmarkingConfiguration configuration); } diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkingConfiguration.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkingConfiguration.java new file mode 100644 index 0000000000..e3003cf58a --- /dev/null +++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkingConfiguration.java @@ -0,0 +1,115 @@ +/* + * 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.benchmark; + +import com.google.cloud.spanner.DatabaseId; +import com.google.cloud.spanner.benchmark.BenchmarkRunner.Environment; +import com.google.cloud.spanner.benchmark.BenchmarkRunner.TransactionType; + +class BenchmarkingConfiguration { + + private DatabaseId databaseId; + private int numOfClients; + private int staleness; + private int warmupTime; + private int executionTime; + private int waitBetweenRequests; + private boolean useMultiplexSession; + private TransactionType transactionType; + private Environment environment; + + int getExecutionTime() { + return executionTime; + } + + BenchmarkingConfiguration setExecutionTime(int executionTime) { + this.executionTime = executionTime; + return this; + } + + DatabaseId getDatabaseId() { + return databaseId; + } + + BenchmarkingConfiguration setDatabaseId(DatabaseId databaseId) { + this.databaseId = databaseId; + return this; + } + + int getNumOfClients() { + return numOfClients; + } + + BenchmarkingConfiguration setNumOfClients(int numOfClients) { + this.numOfClients = numOfClients; + return this; + } + + int getStaleness() { + return staleness; + } + + BenchmarkingConfiguration setStaleness(int staleness) { + this.staleness = staleness; + return this; + } + + int getWarmupTime() { + return warmupTime; + } + + BenchmarkingConfiguration setWarmupTime(int warmupTime) { + this.warmupTime = warmupTime; + return this; + } + + int getWaitBetweenRequests() { + return waitBetweenRequests; + } + + BenchmarkingConfiguration setWaitBetweenRequests(int waitBetweenRequests) { + this.waitBetweenRequests = waitBetweenRequests; + return this; + } + + boolean isUseMultiplexSession() { + return useMultiplexSession; + } + + BenchmarkingConfiguration setUseMultiplexSession(boolean useMultiplexSession) { + this.useMultiplexSession = useMultiplexSession; + return this; + } + + TransactionType getTransactionType() { + return transactionType; + } + + BenchmarkingConfiguration setTransactionType(TransactionType transactionType) { + this.transactionType = transactionType; + return this; + } + + Environment getEnvironment() { + return environment; + } + + BenchmarkingConfiguration setEnvironment(Environment environment) { + this.environment = environment; + return this; + } +} diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java index 6fc0842f37..ebe8f3bbaa 100644 --- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java +++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java @@ -20,6 +20,8 @@ import com.google.cloud.opentelemetry.trace.TraceExporter; 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.ReadOnlyTransaction; import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.SessionPoolOptions; @@ -28,12 +30,11 @@ import com.google.cloud.spanner.SpannerExceptionFactory; import com.google.cloud.spanner.SpannerOptions; import com.google.cloud.spanner.Statement; +import com.google.cloud.spanner.TimestampBound; import com.google.common.base.Stopwatch; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.metrics.DoubleHistogram; -import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.export.MetricExporter; @@ -44,12 +45,14 @@ import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; class JavaClientRunner extends AbstractRunner { private final DatabaseId databaseId; @@ -61,12 +64,7 @@ class JavaClientRunner extends AbstractRunner { } @Override - public List execute( - TransactionType transactionType, - int numClients, - int numOperations, - int waitMillis, - boolean useMultiplexedSession) { + public List execute(BenchmarkingConfiguration configuration) { // setup open telemetry metrics and traces // setup open telemetry metrics and traces SpanExporter traceExporter = TraceExporter.createWithDefaultConfiguration(); @@ -93,7 +91,7 @@ public List execute( .build(); SessionPoolOptions sessionPoolOptions = SessionPoolOptionsHelper.setUseMultiplexedSession( - SessionPoolOptions.newBuilder(), useMultiplexedSession) + SessionPoolOptions.newBuilder(), configuration.isUseMultiplexSession()) .build(); SpannerOptions.enableOpenTelemetryMetrics(); SpannerOptions.enableOpenTelemetryTraces(); @@ -102,67 +100,71 @@ public List execute( .setOpenTelemetry(openTelemetry) .setProjectId(databaseId.getInstanceId().getProject()) .setSessionPoolOption(sessionPoolOptions) - .setHost(SERVER_URL) - .build(); - // Register query stats metric. - // This should be done once before start recording the data. - Meter meter = openTelemetry.getMeter("cloud.google.com/java"); - DoubleHistogram endToEndLatencies = - meter - .histogramBuilder("spanner/end_end_elapsed") - .setDescription("The execution of end to end latency") - .setUnit("ms") + .setHost(SERVER_URL_MAPPING.get(configuration.getEnvironment())) .build(); try (Spanner spanner = options.getService()) { DatabaseClient databaseClient = spanner.getDatabaseClient(databaseId); - List>> results = new ArrayList<>(numClients); - ExecutorService service = Executors.newFixedThreadPool(numClients); - for (int client = 0; client < numClients; client++) { - results.add( - service.submit( - () -> - runBenchmark( - databaseClient, - transactionType, - numOperations, - waitMillis, - endToEndLatencies))); + List>> results = new ArrayList<>(configuration.getNumOfClients()); + ExecutorService service = Executors.newFixedThreadPool(configuration.getNumOfClients()); + for (int client = 0; client < configuration.getNumOfClients(); client++) { + int clientId = client; + results.add(service.submit(() -> runBenchmark(databaseClient, clientId, configuration))); } - return collectResults(service, results, numClients, numOperations); + return collectResults(service, results, configuration); } catch (Throwable t) { throw SpannerExceptionFactory.asSpannerException(t); } } private List runBenchmark( - DatabaseClient databaseClient, - TransactionType transactionType, - int numOperations, - int waitMillis, - DoubleHistogram endToEndLatencies) { - List results = new ArrayList<>(numOperations); + DatabaseClient databaseClient, int clientId, BenchmarkingConfiguration configuration) { + List results = new ArrayList<>(); // Execute one query to make sure everything has been warmed up. - executeTransaction(databaseClient, transactionType, endToEndLatencies); + warmUp(databaseClient, clientId, configuration); + runBenchmark(databaseClient, clientId, configuration, results); + setBenchmarkingCompleted(clientId); + return results; + } - for (int i = 0; i < numOperations; i++) { + private void runBenchmark( + DatabaseClient databaseClient, + int clientId, + BenchmarkingConfiguration configuration, + List results) { + Instant endTime = Instant.now().plus(Duration.ofMinutes(configuration.getExecutionTime())); + initiateTimer(clientId, "Remaining execution time", endTime); + while (endTime.isAfter(Instant.now())) { try { - randomWait(waitMillis); - results.add(executeTransaction(databaseClient, transactionType, endToEndLatencies)); - incOperations(); + randomWait(configuration.getWaitBetweenRequests()); + results.add( + executeTransaction( + databaseClient, configuration.getTransactionType(), configuration.getStaleness())); } catch (InterruptedException interruptedException) { throw SpannerExceptionFactory.propagateInterrupt(interruptedException); } } - return results; + } + + private void warmUp( + DatabaseClient databaseClient, int clientId, BenchmarkingConfiguration configuration) { + Instant endTime = Instant.now().plus(Duration.ofMinutes(configuration.getWarmupTime())); + initiateTimer(clientId, "Remaining warmup time", endTime); + while (endTime.isAfter(Instant.now())) { + executeTransaction( + databaseClient, configuration.getTransactionType(), configuration.getStaleness()); + } } private Duration executeTransaction( - DatabaseClient client, TransactionType transactionType, DoubleHistogram endToEndLatencies) { + DatabaseClient client, TransactionType transactionType, int staleness) { Stopwatch watch = Stopwatch.createStarted(); switch (transactionType) { - case READ_ONLY_SINGLE_USE: - executeSingleUseReadOnlyTransaction(client); + case READ_ONLY_SINGLE_USE_READ: + executeSingleUseReadOnlyTransactionWithRead(client, staleness); + break; + case READ_ONLY_SINGLE_USE_QUERY: + executeSingleUseReadOnlyTransactionWithQuery(client, staleness); break; case READ_ONLY_MULTI_USE: executeMultiUseReadOnlyTransaction(client); @@ -171,13 +173,34 @@ private Duration executeTransaction( executeReadWriteTransaction(client); break; } - Duration elapsedTime = watch.elapsed(); - endToEndLatencies.record(elapsedTime.toMillis()); - return elapsedTime; + return watch.elapsed(); + } + + private void executeSingleUseReadOnlyTransactionWithRead(DatabaseClient client, int staleness) { + List columns = new ArrayList<>(); + int key = getRandomKey(); + columns.add("ID"); + try (ResultSet resultSet = + client + .singleUse(TimestampBound.ofExactStaleness(staleness, TimeUnit.SECONDS)) + .read(TABLE_NAME, KeySet.singleKey(Key.of(key)), columns)) { + while (resultSet.next()) { + for (int i = 0; i < resultSet.getColumnCount(); i++) { + if (resultSet.isNull(i)) { + numNullValues++; + } else { + numNonNullValues++; + } + } + } + } } - private void executeSingleUseReadOnlyTransaction(DatabaseClient client) { - try (ResultSet resultSet = client.singleUse().executeQuery(getRandomisedReadStatement())) { + private void executeSingleUseReadOnlyTransactionWithQuery(DatabaseClient client, int staleness) { + try (ResultSet resultSet = + client + .singleUse(TimestampBound.ofExactStaleness(staleness, TimeUnit.SECONDS)) + .executeQuery(getRandomisedReadStatement())) { while (resultSet.next()) { for (int i = 0; i < resultSet.getColumnCount(); i++) { if (resultSet.isNull(i)) { @@ -225,12 +248,14 @@ private void executeReadWriteTransaction(DatabaseClient client) { } static Statement getRandomisedReadStatement() { - int randomKey = ThreadLocalRandom.current().nextInt(TOTAL_RECORDS); - return Statement.newBuilder(SELECT_QUERY).bind(ID_COLUMN_NAME).to(randomKey).build(); + return Statement.newBuilder(SELECT_QUERY).bind(ID_COLUMN_NAME).to(getRandomKey()).build(); } static Statement getRandomisedUpdateStatement() { - int randomKey = ThreadLocalRandom.current().nextInt(TOTAL_RECORDS); - return Statement.newBuilder(UPDATE_QUERY).bind(ID_COLUMN_NAME).to(randomKey).build(); + return Statement.newBuilder(UPDATE_QUERY).bind(ID_COLUMN_NAME).to(getRandomKey()).build(); + } + + static int getRandomKey() { + return ThreadLocalRandom.current().nextInt(TOTAL_RECORDS); } } diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java index 46083f1fee..d3c2d71e95 100644 --- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java +++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java @@ -18,6 +18,7 @@ import com.google.api.core.InternalApi; import com.google.cloud.spanner.DatabaseId; +import com.google.cloud.spanner.benchmark.BenchmarkRunner.Environment; import com.google.cloud.spanner.benchmark.BenchmarkRunner.TransactionType; import com.google.common.annotations.VisibleForTesting; import java.time.Duration; @@ -65,10 +66,17 @@ private static CommandLine parseCommandLine(String[] args) throws ParseException options.addOption( "c", "clients", true, "The number of clients that will be executing queries in parallel."); options.addOption( - "o", - "operations", + "wu", + "warmupTime", true, - "The number of operations that each client will execute. Defaults to 1000."); + "Total warm up time before running actual benchmarking. Defaults to 7 minutes."); + options.addOption( + "et", + "executionTime", + true, + "Total execution time of the benchmarking. Defaults to 30 minutes."); + options.addOption( + "st", "staleness", true, "Total Staleness for Reads and Queries. Defaults to 15 seconds."); options.addOption( "w", "wait", @@ -78,12 +86,16 @@ private static CommandLine parseCommandLine(String[] args) throws ParseException + " second."); options.addOption( "t", - "transaction", + "transactionType", true, "The type of transaction to execute. Must be either READ_ONLY or READ_WRITE. Defaults to" + " READ_ONLY."); - options.addOption("m", "multiplexed", true, "Use multiplexed sessions. Defaults to false."); - options.addOption("w", "wait", true, "Wait time in millis. Defaults to zero."); + options.addOption( + "e", + "environment", + true, + "Spanner Environment. Must be either PROD or CLOUD_DEVEL. Default to CLOUD_DEVEL"); + options.addOption("m", "multiplexed", true, "Use multiplexed sessions. Defaults to true."); options.addOption("name", true, "Name of this test run"); CommandLineParser parser = new DefaultParser(); return parser.parse(options, args); @@ -97,34 +109,54 @@ private static CommandLine parseCommandLine(String[] args) throws ParseException public void run(CommandLine commandLine) { int clients = - commandLine.hasOption('c') ? Integer.parseInt(commandLine.getOptionValue('c')) : 16; - int operations = - commandLine.hasOption('o') ? Integer.parseInt(commandLine.getOptionValue('o')) : 1000; + commandLine.hasOption('c') ? Integer.parseInt(commandLine.getOptionValue('c')) : 1; + int executionTime = + commandLine.hasOption("et") ? Integer.parseInt(commandLine.getOptionValue("et")) : 30; + int warmUpTime = + commandLine.hasOption("wu") ? Integer.parseInt(commandLine.getOptionValue("wu")) : 7; int waitMillis = commandLine.hasOption('w') ? Integer.parseInt(commandLine.getOptionValue('w')) : 0; + int staleness = + commandLine.hasOption("st") ? Integer.parseInt(commandLine.getOptionValue("st")) : 15; TransactionType transactionType = commandLine.hasOption('t') ? TransactionType.valueOf(commandLine.getOptionValue('t').toUpperCase(Locale.ENGLISH)) - : TransactionType.READ_ONLY_SINGLE_USE; + : TransactionType.READ_ONLY_SINGLE_USE_QUERY; boolean useMultiplexedSession = - commandLine.hasOption('m') ? Boolean.parseBoolean(commandLine.getOptionValue('m')) : false; + !commandLine.hasOption('m') || Boolean.parseBoolean(commandLine.getOptionValue('m')); + Environment environment = + commandLine.hasOption('e') + ? Environment.valueOf(commandLine.getOptionValue('e').toUpperCase(Locale.ENGLISH)) + : Environment.CLOUD_DEVEL; + + BenchmarkingConfiguration configuration = + new BenchmarkingConfiguration() + .setDatabaseId(databaseId) + .setNumOfClients(clients) + .setExecutionTime(executionTime) + .setWarmupTime(warmUpTime) + .setStaleness(staleness) + .setTransactionType(transactionType) + .setUseMultiplexSession(useMultiplexedSession) + .setWaitBetweenRequests(waitMillis) + .setEnvironment(environment); System.out.println(); System.out.println("Running benchmark with the following options"); - System.out.printf("Database: %s\n", databaseId); - System.out.printf("Clients: %d\n", clients); - System.out.printf("Operations: %d\n", operations); - System.out.printf("Transaction type: %s\n", transactionType); - System.out.printf("Use Multiplexed Sessions: %s\n", useMultiplexedSession); - System.out.printf("Wait between queries: %dms\n", waitMillis); + System.out.printf("Database: %s\n", configuration.getDatabaseId()); + System.out.printf("Clients: %d\n", configuration.getNumOfClients()); + System.out.printf("Total Warm up Time: %d mins\n", configuration.getWarmupTime()); + System.out.printf("Total Execution Time: %d mins\n", configuration.getExecutionTime()); + System.out.printf("Staleness: %d secs\n", configuration.getStaleness()); + System.out.printf("Transaction type: %s\n", configuration.getTransactionType()); + System.out.printf("Use Multiplexed Sessions: %s\n", configuration.isUseMultiplexSession()); + System.out.printf("Wait between requests: %dms\n", configuration.getWaitBetweenRequests()); List javaClientResults = null; System.out.println(); System.out.println("Running benchmark for Java Client Library"); - JavaClientRunner javaClientRunner = new JavaClientRunner(databaseId); - javaClientResults = - javaClientRunner.execute( - transactionType, clients, operations, waitMillis, useMultiplexedSession); + JavaClientRunner javaClientRunner = new JavaClientRunner(configuration.getDatabaseId()); + javaClientResults = javaClientRunner.execute(configuration); printResults("Java Client Library", javaClientResults); } From c0a7ccaad090051f77f9102e738f95f481c9c593 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian <179120858+sakthivelmanii@users.noreply.github.com> Date: Tue, 20 May 2025 21:03:03 +0530 Subject: [PATCH 18/25] ci: disable split points IT (#3885) --- .../java/com/example/spanner/DatabaseAddSplitPointsIT.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/snippets/src/test/java/com/example/spanner/DatabaseAddSplitPointsIT.java b/samples/snippets/src/test/java/com/example/spanner/DatabaseAddSplitPointsIT.java index 7b2be31425..c9215b78cd 100644 --- a/samples/snippets/src/test/java/com/example/spanner/DatabaseAddSplitPointsIT.java +++ b/samples/snippets/src/test/java/com/example/spanner/DatabaseAddSplitPointsIT.java @@ -46,7 +46,8 @@ public void setup() throws ExecutionException, InterruptedException { .get(); } - @Test + // TODO: Enable the test once the issue with split points is resolved + // @Test public void testAddSplits() throws Exception { final String out = SampleRunner.runSample( From 3070f1db97788c2a55c553ab8a4de3419d1ccf5c Mon Sep 17 00:00:00 2001 From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com> Date: Tue, 20 May 2025 14:04:15 -0400 Subject: [PATCH 19/25] chore: Update generation configuration at Tue May 20 16:30:59 UTC 2025 (#3886) * chore: Update generation configuration at Tue May 20 16:30:59 UTC 2025 * chore: generate libraries at Tue May 20 16:31: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 +- .../database/v1/DatabaseAdminClient.java | 3 + .../v1/SpannerDatabaseAdminProto.java | 635 +++++++++--------- .../database/v1/UpdateDatabaseDdlRequest.java | 105 +++ .../v1/UpdateDatabaseDdlRequestOrBuilder.java | 15 + .../database/v1/spanner_database_admin.proto | 5 + 10 files changed, 456 insertions(+), 321 deletions(-) diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg index 24e5053a5b..d72ed3f0e3 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.47.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.48.0" # {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 ae35f6cb21..f2e296b847 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.47.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.48.0" # {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 660f1ee7ea..68512fbff5 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.47.0" # {x-version-update:google-cloud-shared-dependencies:current} + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.48.0" # {x-version-update:google-cloud-shared-dependencies:current} } env_vars: { diff --git a/README.md b/README.md index 24a1a9ca4c..c52608bfba 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.59.0') +implementation platform('com.google.cloud:libraries-bom:26.60.0') implementation 'com.google.cloud:google-cloud-spanner' ``` diff --git a/generation_config.yaml b/generation_config.yaml index 5b109886e3..6f235d03c5 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,6 +1,6 @@ -gapic_generator_version: 2.57.0 -googleapis_commitish: 69d549c7eaccfc9584fd64c38c746a48ef635f60 -libraries_bom_version: 26.59.0 +gapic_generator_version: 2.58.0 +googleapis_commitish: 7d43527b927f65a80de9f0071d0a2e1c172de849 +libraries_bom_version: 26.60.0 libraries: - api_shortname: spanner name_pretty: Cloud Spanner diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java index b91188619a..6ba935d94e 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/admin/database/v1/DatabaseAdminClient.java @@ -1583,6 +1583,7 @@ public final OperationFuture updateDatabaseDdl * .addAllStatements(new ArrayList()) * .setOperationId("operationId129704162") * .setProtoDescriptors(ByteString.EMPTY) + * .setThroughputMode(true) * .build(); * databaseAdminClient.updateDatabaseDdlAsync(request).get(); * } @@ -1621,6 +1622,7 @@ public final OperationFuture updateDatabaseDdl * .addAllStatements(new ArrayList()) * .setOperationId("operationId129704162") * .setProtoDescriptors(ByteString.EMPTY) + * .setThroughputMode(true) * .build(); * OperationFuture future = * databaseAdminClient.updateDatabaseDdlOperationCallable().futureCall(request); @@ -1659,6 +1661,7 @@ public final OperationFuture updateDatabaseDdl * .addAllStatements(new ArrayList()) * .setOperationId("operationId129704162") * .setProtoDescriptors(ByteString.EMPTY) + * .setThroughputMode(true) * .build(); * ApiFuture future = * databaseAdminClient.updateDatabaseDdlCallable().futureCall(request); diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/SpannerDatabaseAdminProto.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/SpannerDatabaseAdminProto.java index 2e69263326..5f00550cff 100644 --- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/SpannerDatabaseAdminProto.java +++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/SpannerDatabaseAdminProto.java @@ -149,325 +149,332 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { static { java.lang.String[] descriptorData = { - "\n" - + "=google/spanner/admin/database/v1/spanner_database_admin.proto\022 google.spanner." + "\n=google/spanner/admin/database/v1/spann" + + "er_database_admin.proto\022 google.spanner." + "admin.database.v1\032\034google/api/annotation" + "s.proto\032\027google/api/client.proto\032\037google" + "/api/field_behavior.proto\032\031google/api/re" + "source.proto\032\036google/iam/v1/iam_policy.p" + "roto\032\032google/iam/v1/policy.proto\032#google" - + "/longrunning/operations.proto\032\033google/protobuf/empty.proto\032" - + " google/protobuf/field_mask.proto\032\034google/protobuf/struct.pro" + + "/longrunning/operations.proto\032\033google/pr" + + "otobuf/empty.proto\032 google/protobuf/fiel" + + "d_mask.proto\032\034google/protobuf/struct.pro" + "to\032\037google/protobuf/timestamp.proto\032-goo" - + "gle/spanner/admin/database/v1/backup.proto\0326google/spanner/admin/database/v1/bac" - + "kup_schedule.proto\032-google/spanner/admin/database/v1/common.proto\"\253\001\n" - + "\013RestoreInfo\022H\n" - + "\013source_type\030\001" - + " \001(\01623.google.spanner.admin.database.v1.RestoreSourceType\022C\n" - + "\013backup_info\030\002" - + " \001(\0132,.google.spanner.admin.database.v1.BackupInfoH\000B\r\n" - + "\013source_info\"\312\006\n" - + "\010Database\022\021\n" - + "\004name\030\001 \001(\tB\003\340A\002\022D\n" - + "\005state\030\002" - + " \001(\01620.google.spanner.admin.database.v1.Database.StateB\003\340A\003\0224\n" - + "\013create_time\030\003 \001(\0132\032.google.protobuf.TimestampB\003\340A\003\022H\n" - + "\014restore_info\030\004" - + " \001(\0132-.google.spanner.admin.database.v1.RestoreInfoB\003\340A\003\022R\n" - + "\021encryption_config\030\005" - + " \001(\01322.google.spanner.admin.database.v1.EncryptionConfigB\003\340A\003\022N\n" - + "\017encryption_info\030\010" - + " \003(\01320.google.spanner.admin.database.v1.EncryptionInfoB\003\340A\003\022%\n" - + "\030version_retention_period\030\006 \001(\tB\003\340A\003\022>\n" - + "\025earliest_version_time\030\007" - + " \001(\0132\032.google.protobuf.TimestampB\003\340A\003\022\033\n" - + "\016default_leader\030\t \001(\tB\003\340A\003\022P\n" - + "\020database_dialect\030\n" - + " \001(\01621.google.spanner.admin.database.v1.DatabaseDialectB\003\340A\003\022\036\n" - + "\026enable_drop_protection\030\013 \001(\010\022\030\n" - + "\013reconciling\030\014 \001(\010B\003\340A\003\"M\n" - + "\005State\022\025\n" - + "\021STATE_UNSPECIFIED\020\000\022\014\n" - + "\010CREATING\020\001\022\t\n" - + "\005READY\020\002\022\024\n" - + "\020READY_OPTIMIZING\020\003:b\352A_\n" - + "\037spanner.googleapis.com/Database\022\332A\006pare" - + "nt\202\323\344\223\002/\022-/v1/{parent=projects/*/instances/*}/databases\022\244\002\n" - + "\016CreateDatabase\0227.google.spanner.admin.database.v1.CreateData" - + "baseRequest\032\035.google.longrunning.Operation\"\271\001\312Ad\n" - + ")google.spanner.admin.database.v1.Database\0227google.spanner.admin.databa" - + "se.v1.CreateDatabaseMetadata\332A\027parent,cr" - + "eate_statement\202\323\344\223\0022\"-/v1/{parent=projects/*/instances/*}/databases:\001*\022\255\001\n" - + "\013GetDatabase\0224.google.spanner.admin.database.v" - + "1.GetDatabaseRequest\032*.google.spanner.ad" - + "min.database.v1.Database\"<\332A\004name\202\323\344\223\002/\022" - + "-/v1/{name=projects/*/instances/*/databases/*}\022\357\001\n" - + "\016UpdateDatabase\0227.google.spann" - + "er.admin.database.v1.UpdateDatabaseRequest\032\035.google.longrunning.Operation\"\204\001\312A\"\n" - + "\010Database\022\026UpdateDatabaseMetadata\332A\024data" - + "base,update_mask\202\323\344\223\002B26/v1/{database.na" - + "me=projects/*/instances/*/databases/*}:\010database\022\235\002\n" - + "\021UpdateDatabaseDdl\022:.google.spanner.admin.database.v1.UpdateDatabase" - + "DdlRequest\032\035.google.longrunning.Operation\"\254\001\312AS\n" - + "\025google.protobuf.Empty\022:google.spanner.admin.database.v1.UpdateDatabaseD" - + "dlMetadata\332A\023database,statements\202\323\344\223\002:25" - + "/v1/{database=projects/*/instances/*/databases/*}/ddl:\001*\022\243\001\n" - + "\014DropDatabase\0225.google.spanner.admin.database.v1.DropDatabas" - + "eRequest\032\026.google.protobuf.Empty\"D\332A\010dat" - + "abase\202\323\344\223\0023*1/v1/{database=projects/*/instances/*/databases/*}\022\315\001\n" - + "\016GetDatabaseDdl\0227.google.spanner.admin.database.v1.Get" - + "DatabaseDdlRequest\0328.google.spanner.admi" - + "n.database.v1.GetDatabaseDdlResponse\"H\332A" - + "\010database\202\323\344\223\0027\0225/v1/{database=projects/*/instances/*/databases/*}/ddl\022\302\002\n" - + "\014SetIamPolicy\022\".google.iam.v1.SetIamPolicyRequ" - + "est\032\025.google.iam.v1.Policy\"\366\001\332A\017resource" - + ",policy\202\323\344\223\002\335\001\">/v1/{resource=projects/*" - + "/instances/*/databases/*}:setIamPolicy:\001*ZA\"/v1/{resource=projects/*/i" - + "nstances/*/databases/*}:getIamPolicy:\001*ZA\".google.spanner.admin.database.v1.ListBa" - + "ckupOperationsResponse\"E\332A\006parent\202\323\344\223\0026\022" - + "4/v1/{parent=projects/*/instances/*}/backupOperations\022\334\001\n" - + "\021ListDatabaseRoles\022:.google.spanner.admin.database.v1.ListDatab" - + "aseRolesRequest\032;.google.spanner.admin.d" - + "atabase.v1.ListDatabaseRolesResponse\"N\332A" - + "\006parent\202\323\344\223\002?\022=/v1/{parent=projects/*/instances/*/databases/*}/databaseRoles\022\350\001\n" - + "\016AddSplitPoints\0227.google.spanner.admin.d" - + "atabase.v1.AddSplitPointsRequest\0328.google.spanner.admin.database.v1.AddSplitPoin" - + "tsResponse\"c\332A\025database,split_points\202\323\344\223" - + "\002E\"@/v1/{database=projects/*/instances/*/databases/*}:addSplitPoints:\001*\022\216\002\n" - + "\024CreateBackupSchedule\022=.google.spanner.admin." - + "database.v1.CreateBackupScheduleRequest\0320.google.spanner.admin.database.v1.Backu" - + "pSchedule\"\204\001\332A)parent,backup_schedule,ba" - + "ckup_schedule_id\202\323\344\223\002R\"?/v1/{parent=proj" - + "ects/*/instances/*/databases/*}/backupSchedules:\017backup_schedule\022\321\001\n" - + "\021GetBackupSchedule\022:.google.spanner.admin.database.v" - + "1.GetBackupScheduleRequest\0320.google.span" - + "ner.admin.database.v1.BackupSchedule\"N\332A" - + "\004name\202\323\344\223\002A\022?/v1/{name=projects/*/instances/*/databases/*/backupSchedules/*}\022\220\002\n" - + "\024UpdateBackupSchedule\022=.google.spanner.admin.database.v1.UpdateBackupScheduleReq" - + "uest\0320.google.spanner.admin.database.v1." - + "BackupSchedule\"\206\001\332A\033backup_schedule,upda" - + "te_mask\202\323\344\223\002b2O/v1/{backup_schedule.name" - + "=projects/*/instances/*/databases/*/backupSchedules/*}:\017backup_schedule\022\275\001\n" - + "\024DeleteBackupSchedule\022=.google.spanner.admin." - + "database.v1.DeleteBackupScheduleRequest\032" - + "\026.google.protobuf.Empty\"N\332A\004name\202\323\344\223\002A*?" - + "/v1/{name=projects/*/instances/*/databases/*/backupSchedules/*}\022\344\001\n" - + "\023ListBackupSchedules\022<.google.spanner.admin.database." - + "v1.ListBackupSchedulesRequest\032=.google.spanner.admin.database.v1.ListBackupSched" - + "ulesResponse\"P\332A\006parent\202\323\344\223\002A\022?/v1/{pare" - + "nt=projects/*/instances/*/databases/*}/b" - + "ackupSchedules\032x\312A\026spanner.googleapis.co" - + "m\322A\\https://www.googleapis.com/auth/clou" - + "d-platform,https://www.googleapis.com/auth/spanner.adminB\326\003\n" - + "$com.google.spanner.admin.database.v1B\031SpannerDatabaseAdminP" - + "rotoP\001ZFcloud.google.com/go/spanner/admi" - + "n/database/apiv1/databasepb;databasepb\252\002" - + "&Google.Cloud.Spanner.Admin.Database.V1\312" - + "\002&Google\\Cloud\\Spanner\\Admin\\Database\\V1" - + "\352\002+Google::Cloud::Spanner::Admin::Database::V1\352AJ\n" - + "\037spanner.googleapis.com/Instan" - + "ce\022\'projects/{project}/instances/{instance}\352A{\n" - + "(spanner.googleapis.com/InstancePartition\022Oprojects/{project}/instances/{" - + "instance}/instancePartitions/{instance_partition}b\006proto3" + + "gle/spanner/admin/database/v1/backup.pro" + + "to\0326google/spanner/admin/database/v1/bac" + + "kup_schedule.proto\032-google/spanner/admin" + + "/database/v1/common.proto\"\253\001\n\013RestoreInf" + + "o\022H\n\013source_type\030\001 \001(\01623.google.spanner." + + "admin.database.v1.RestoreSourceType\022C\n\013b" + + "ackup_info\030\002 \001(\0132,.google.spanner.admin." + + "database.v1.BackupInfoH\000B\r\n\013source_info\"" + + "\312\006\n\010Database\022\021\n\004name\030\001 \001(\tB\003\340A\002\022D\n\005state" + + "\030\002 \001(\01620.google.spanner.admin.database.v" + + "1.Database.StateB\003\340A\003\0224\n\013create_time\030\003 \001" + + "(\0132\032.google.protobuf.TimestampB\003\340A\003\022H\n\014r" + + "estore_info\030\004 \001(\0132-.google.spanner.admin" + + ".database.v1.RestoreInfoB\003\340A\003\022R\n\021encrypt" + + "ion_config\030\005 \001(\01322.google.spanner.admin." + + "database.v1.EncryptionConfigB\003\340A\003\022N\n\017enc" + + "ryption_info\030\010 \003(\01320.google.spanner.admi" + + "n.database.v1.EncryptionInfoB\003\340A\003\022%\n\030ver" + + "sion_retention_period\030\006 \001(\tB\003\340A\003\022>\n\025earl" + + "iest_version_time\030\007 \001(\0132\032.google.protobu" + + "f.TimestampB\003\340A\003\022\033\n\016default_leader\030\t \001(\t" + + "B\003\340A\003\022P\n\020database_dialect\030\n \001(\01621.google" + + ".spanner.admin.database.v1.DatabaseDiale" + + "ctB\003\340A\003\022\036\n\026enable_drop_protection\030\013 \001(\010\022" + + "\030\n\013reconciling\030\014 \001(\010B\003\340A\003\"M\n\005State\022\025\n\021ST" + + "ATE_UNSPECIFIED\020\000\022\014\n\010CREATING\020\001\022\t\n\005READY" + + "\020\002\022\024\n\020READY_OPTIMIZING\020\003:b\352A_\n\037spanner.g" + + "oogleapis.com/Database\022\332A\006parent\202\323\344\223\002/\022-" + + "/v1/{parent=projects/*/instances/*}/data" + + "bases\022\244\002\n\016CreateDatabase\0227.google.spanne" + + "r.admin.database.v1.CreateDatabaseReques" + + "t\032\035.google.longrunning.Operation\"\271\001\312Ad\n)" + + "google.spanner.admin.database.v1.Databas" + + "e\0227google.spanner.admin.database.v1.Crea" + + "teDatabaseMetadata\332A\027parent,create_state" + + "ment\202\323\344\223\0022\"-/v1/{parent=projects/*/insta" + + "nces/*}/databases:\001*\022\255\001\n\013GetDatabase\0224.g" + + "oogle.spanner.admin.database.v1.GetDatab" + + "aseRequest\032*.google.spanner.admin.databa" + + "se.v1.Database\"<\332A\004name\202\323\344\223\002/\022-/v1/{name" + + "=projects/*/instances/*/databases/*}\022\357\001\n" + + "\016UpdateDatabase\0227.google.spanner.admin.d" + + "atabase.v1.UpdateDatabaseRequest\032\035.googl" + + "e.longrunning.Operation\"\204\001\312A\"\n\010Database\022" + + "\026UpdateDatabaseMetadata\332A\024database,updat" + + "e_mask\202\323\344\223\002B26/v1/{database.name=project" + + "s/*/instances/*/databases/*}:\010database\022\235" + + "\002\n\021UpdateDatabaseDdl\022:.google.spanner.ad" + + "min.database.v1.UpdateDatabaseDdlRequest" + + "\032\035.google.longrunning.Operation\"\254\001\312AS\n\025g" + + "oogle.protobuf.Empty\022:google.spanner.adm" + + "in.database.v1.UpdateDatabaseDdlMetadata" + + "\332A\023database,statements\202\323\344\223\002:25/v1/{datab" + + "ase=projects/*/instances/*/databases/*}/" + + "ddl:\001*\022\243\001\n\014DropDatabase\0225.google.spanner" + + ".admin.database.v1.DropDatabaseRequest\032\026" + + ".google.protobuf.Empty\"D\332A\010database\202\323\344\223\002" + + "3*1/v1/{database=projects/*/instances/*/" + + "databases/*}\022\315\001\n\016GetDatabaseDdl\0227.google" + + ".spanner.admin.database.v1.GetDatabaseDd" + + "lRequest\0328.google.spanner.admin.database" + + ".v1.GetDatabaseDdlResponse\"H\332A\010database\202" + + "\323\344\223\0027\0225/v1/{database=projects/*/instance" + + "s/*/databases/*}/ddl\022\302\002\n\014SetIamPolicy\022\"." + + "google.iam.v1.SetIamPolicyRequest\032\025.goog" + + "le.iam.v1.Policy\"\366\001\332A\017resource,policy\202\323\344" + + "\223\002\335\001\">/v1/{resource=projects/*/instances" + + "/*/databases/*}:setIamPolicy:\001*ZA\"/v1/{resource=projects/*/instances/*" + + "/databases/*}:getIamPolicy:\001*ZA\".google.sp" + + "anner.admin.database.v1.ListBackupOperat" + + "ionsResponse\"E\332A\006parent\202\323\344\223\0026\0224/v1/{pare" + + "nt=projects/*/instances/*}/backupOperati" + + "ons\022\334\001\n\021ListDatabaseRoles\022:.google.spann" + + "er.admin.database.v1.ListDatabaseRolesRe" + + "quest\032;.google.spanner.admin.database.v1" + + ".ListDatabaseRolesResponse\"N\332A\006parent\202\323\344" + + "\223\002?\022=/v1/{parent=projects/*/instances/*/" + + "databases/*}/databaseRoles\022\350\001\n\016AddSplitP" + + "oints\0227.google.spanner.admin.database.v1" + + ".AddSplitPointsRequest\0328.google.spanner." + + "admin.database.v1.AddSplitPointsResponse" + + "\"c\332A\025database,split_points\202\323\344\223\002E\"@/v1/{d" + + "atabase=projects/*/instances/*/databases" + + "/*}:addSplitPoints:\001*\022\216\002\n\024CreateBackupSc" + + "hedule\022=.google.spanner.admin.database.v" + + "1.CreateBackupScheduleRequest\0320.google.s" + + "panner.admin.database.v1.BackupSchedule\"" + + "\204\001\332A)parent,backup_schedule,backup_sched" + + "ule_id\202\323\344\223\002R\"?/v1/{parent=projects/*/ins" + + "tances/*/databases/*}/backupSchedules:\017b" + + "ackup_schedule\022\321\001\n\021GetBackupSchedule\022:.g" + + "oogle.spanner.admin.database.v1.GetBacku" + + "pScheduleRequest\0320.google.spanner.admin." + + "database.v1.BackupSchedule\"N\332A\004name\202\323\344\223\002" + + "A\022?/v1/{name=projects/*/instances/*/data" + + "bases/*/backupSchedules/*}\022\220\002\n\024UpdateBac" + + "kupSchedule\022=.google.spanner.admin.datab" + + "ase.v1.UpdateBackupScheduleRequest\0320.goo" + + "gle.spanner.admin.database.v1.BackupSche" + + "dule\"\206\001\332A\033backup_schedule,update_mask\202\323\344" + + "\223\002b2O/v1/{backup_schedule.name=projects/" + + "*/instances/*/databases/*/backupSchedule" + + "s/*}:\017backup_schedule\022\275\001\n\024DeleteBackupSc" + + "hedule\022=.google.spanner.admin.database.v" + + "1.DeleteBackupScheduleRequest\032\026.google.p" + + "rotobuf.Empty\"N\332A\004name\202\323\344\223\002A*?/v1/{name=" + + "projects/*/instances/*/databases/*/backu" + + "pSchedules/*}\022\344\001\n\023ListBackupSchedules\022<." + + "google.spanner.admin.database.v1.ListBac" + + "kupSchedulesRequest\032=.google.spanner.adm" + + "in.database.v1.ListBackupSchedulesRespon" + + "se\"P\332A\006parent\202\323\344\223\002A\022?/v1/{parent=project" + + "s/*/instances/*/databases/*}/backupSched" + + "ules\032x\312A\026spanner.googleapis.com\322A\\https:" + + "//www.googleapis.com/auth/cloud-platform" + + ",https://www.googleapis.com/auth/spanner" + + ".adminB\326\003\n$com.google.spanner.admin.data" + + "base.v1B\031SpannerDatabaseAdminProtoP\001ZFcl" + + "oud.google.com/go/spanner/admin/database" + + "/apiv1/databasepb;databasepb\252\002&Google.Cl" + + "oud.Spanner.Admin.Database.V1\312\002&Google\\C" + + "loud\\Spanner\\Admin\\Database\\V1\352\002+Google:" + + ":Cloud::Spanner::Admin::Database::V1\352AJ\n" + + "\037spanner.googleapis.com/Instance\022\'projec" + + "ts/{project}/instances/{instance}\352A{\n(sp" + + "anner.googleapis.com/InstancePartition\022O" + + "projects/{project}/instances/{instance}/" + + "instancePartitions/{instance_partition}b" + + "\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( @@ -582,7 +589,7 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_google_spanner_admin_database_v1_UpdateDatabaseDdlRequest_descriptor, new java.lang.String[] { - "Database", "Statements", "OperationId", "ProtoDescriptors", + "Database", "Statements", "OperationId", "ProtoDescriptors", "ThroughputMode", }); internal_static_google_spanner_admin_database_v1_DdlStatementActionInfo_descriptor = getDescriptor().getMessageTypes().get(10); diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java index b8ff463ee2..55dc816476 100644 --- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java +++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequest.java @@ -332,6 +332,27 @@ public com.google.protobuf.ByteString getProtoDescriptors() { return protoDescriptors_; } + public static final int THROUGHPUT_MODE_FIELD_NUMBER = 5; + private boolean throughputMode_ = false; + + /** + * + * + *
+   * Optional. This field is exposed to be used by the Spanner Migration Tool.
+   * For more details, see
+   * [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool).
+   * 
+ * + * bool throughput_mode = 5 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The throughputMode. + */ + @java.lang.Override + public boolean getThroughputMode() { + return throughputMode_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -358,6 +379,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io if (!protoDescriptors_.isEmpty()) { output.writeBytes(4, protoDescriptors_); } + if (throughputMode_ != false) { + output.writeBool(5, throughputMode_); + } getUnknownFields().writeTo(output); } @@ -384,6 +408,9 @@ public int getSerializedSize() { if (!protoDescriptors_.isEmpty()) { size += com.google.protobuf.CodedOutputStream.computeBytesSize(4, protoDescriptors_); } + if (throughputMode_ != false) { + size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, throughputMode_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -404,6 +431,7 @@ public boolean equals(final java.lang.Object obj) { if (!getStatementsList().equals(other.getStatementsList())) return false; if (!getOperationId().equals(other.getOperationId())) return false; if (!getProtoDescriptors().equals(other.getProtoDescriptors())) return false; + if (getThroughputMode() != other.getThroughputMode()) return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -425,6 +453,8 @@ public int hashCode() { hash = (53 * hash) + getOperationId().hashCode(); hash = (37 * hash) + PROTO_DESCRIPTORS_FIELD_NUMBER; hash = (53 * hash) + getProtoDescriptors().hashCode(); + hash = (37 * hash) + THROUGHPUT_MODE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getThroughputMode()); hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -585,6 +615,7 @@ public Builder clear() { statements_ = com.google.protobuf.LazyStringArrayList.emptyList(); operationId_ = ""; protoDescriptors_ = com.google.protobuf.ByteString.EMPTY; + throughputMode_ = false; return this; } @@ -636,6 +667,9 @@ private void buildPartial0( if (((from_bitField0_ & 0x00000008) != 0)) { result.protoDescriptors_ = protoDescriptors_; } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.throughputMode_ = throughputMode_; + } } @java.lang.Override @@ -708,6 +742,9 @@ public Builder mergeFrom(com.google.spanner.admin.database.v1.UpdateDatabaseDdlR if (other.getProtoDescriptors() != com.google.protobuf.ByteString.EMPTY) { setProtoDescriptors(other.getProtoDescriptors()); } + if (other.getThroughputMode() != false) { + setThroughputMode(other.getThroughputMode()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -759,6 +796,12 @@ public Builder mergeFrom( bitField0_ |= 0x00000008; break; } // case 34 + case 40: + { + throughputMode_ = input.readBool(); + bitField0_ |= 0x00000010; + break; + } // case 40 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { @@ -1390,6 +1433,68 @@ public Builder clearProtoDescriptors() { return this; } + private boolean throughputMode_; + + /** + * + * + *
+     * Optional. This field is exposed to be used by the Spanner Migration Tool.
+     * For more details, see
+     * [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool).
+     * 
+ * + * bool throughput_mode = 5 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The throughputMode. + */ + @java.lang.Override + public boolean getThroughputMode() { + return throughputMode_; + } + + /** + * + * + *
+     * Optional. This field is exposed to be used by the Spanner Migration Tool.
+     * For more details, see
+     * [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool).
+     * 
+ * + * bool throughput_mode = 5 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The throughputMode to set. + * @return This builder for chaining. + */ + public Builder setThroughputMode(boolean value) { + + throughputMode_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + /** + * + * + *
+     * Optional. This field is exposed to be used by the Spanner Migration Tool.
+     * For more details, see
+     * [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool).
+     * 
+ * + * bool throughput_mode = 5 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearThroughputMode() { + bitField0_ = (bitField0_ & ~0x00000010); + throughputMode_ = false; + onChanged(); + return this; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequestOrBuilder.java b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequestOrBuilder.java index 755576518a..cfa0c4d916 100644 --- a/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequestOrBuilder.java +++ b/proto-google-cloud-spanner-admin-database-v1/src/main/java/com/google/spanner/admin/database/v1/UpdateDatabaseDdlRequestOrBuilder.java @@ -199,4 +199,19 @@ public interface UpdateDatabaseDdlRequestOrBuilder * @return The protoDescriptors. */ com.google.protobuf.ByteString getProtoDescriptors(); + + /** + * + * + *
+   * Optional. This field is exposed to be used by the Spanner Migration Tool.
+   * For more details, see
+   * [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool).
+   * 
+ * + * bool throughput_mode = 5 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The throughputMode. + */ + boolean getThroughputMode(); } diff --git a/proto-google-cloud-spanner-admin-database-v1/src/main/proto/google/spanner/admin/database/v1/spanner_database_admin.proto b/proto-google-cloud-spanner-admin-database-v1/src/main/proto/google/spanner/admin/database/v1/spanner_database_admin.proto index 084f98c68b..36e06f1e1f 100644 --- a/proto-google-cloud-spanner-admin-database-v1/src/main/proto/google/spanner/admin/database/v1/spanner_database_admin.proto +++ b/proto-google-cloud-spanner-admin-database-v1/src/main/proto/google/spanner/admin/database/v1/spanner_database_admin.proto @@ -813,6 +813,11 @@ message UpdateDatabaseDdlRequest { // For more details, see protobuffer [self // description](https://developers.google.com/protocol-buffers/docs/techniques#self-description). bytes proto_descriptors = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. This field is exposed to be used by the Spanner Migration Tool. + // For more details, see + // [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool). + bool throughput_mode = 5 [(google.api.field_behavior) = OPTIONAL]; } // Action information extracted from a DDL statement. This proto is used to From f3b00b663aa897fda1bc21222d29726e6be630cb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 20 May 2025 20:06:16 +0200 Subject: [PATCH 20/25] deps: update dependency com.google.cloud:sdk-platform-java-config to v3.48.0 (#3880) From b7f638ca3ce77d5eeaa4a467afae610c11490e36 Mon Sep 17 00:00:00 2001 From: Sagnik Ghosh Date: Tue, 20 May 2025 23:39:41 +0530 Subject: [PATCH 21/25] chore: enable experimentalHost support for pgAdapter (#3883) Co-authored-by: rahul2393 --- .../google/cloud/spanner/connection/SpannerPool.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 60b1acfb60..8c521b7500 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 @@ -163,6 +163,7 @@ static class SpannerPoolKey { private final boolean enableEndToEndTracing; private final String clientCertificate; private final String clientCertificateKey; + private final boolean isExperimentalHost; @VisibleForTesting static SpannerPoolKey of(ConnectionOptions options) { @@ -196,6 +197,7 @@ private SpannerPoolKey(ConnectionOptions options) throws IOException { this.enableEndToEndTracing = options.isEndToEndTracingEnabled(); this.clientCertificate = options.getClientCertificate(); this.clientCertificateKey = options.getClientCertificateKey(); + this.isExperimentalHost = options.isExperimentalHost(); } @Override @@ -220,7 +222,8 @@ public boolean equals(Object o) { && Objects.equals(this.enableApiTracing, other.enableApiTracing) && Objects.equals(this.enableEndToEndTracing, other.enableEndToEndTracing) && Objects.equals(this.clientCertificate, other.clientCertificate) - && Objects.equals(this.clientCertificateKey, other.clientCertificateKey); + && Objects.equals(this.clientCertificateKey, other.clientCertificateKey) + && Objects.equals(this.isExperimentalHost, other.isExperimentalHost); } @Override @@ -241,7 +244,8 @@ public int hashCode() { this.enableApiTracing, this.enableEndToEndTracing, this.clientCertificate, - this.clientCertificateKey); + this.clientCertificateKey, + this.isExperimentalHost); } } @@ -405,6 +409,9 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) { if (key.clientCertificate != null && key.clientCertificateKey != null) { builder.useClientCert(key.clientCertificate, key.clientCertificateKey); } + if (key.isExperimentalHost) { + builder.setExperimentalHost(key.host); + } if (options.getConfigurator() != null) { options.getConfigurator().configure(builder); } From 5022147f94c703caaa33a9fad4dbc5bedb4cd72c Mon Sep 17 00:00:00 2001 From: cloud-java-bot <122572305+cloud-java-bot@users.noreply.github.com> Date: Wed, 21 May 2025 10:32:43 -0400 Subject: [PATCH 22/25] chore: Update generation configuration at Wed May 21 02:31:39 UTC 2025 (#3888) --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index 6f235d03c5..4bb3f10afe 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,5 +1,5 @@ gapic_generator_version: 2.58.0 -googleapis_commitish: 7d43527b927f65a80de9f0071d0a2e1c172de849 +googleapis_commitish: 5c929307255b1726cdc72855ffc67014fc897d11 libraries_bom_version: 26.60.0 libraries: - api_shortname: spanner From 9424d32fa5a5c6e7d52aed6a88abc1efe2fe4b75 Mon Sep 17 00:00:00 2001 From: Gagan Gupta Date: Wed, 21 May 2025 21:04:22 +0530 Subject: [PATCH 23/25] chore: support UUID in Cloud Client Executor (#3841) * Add support for UUID in CloudClientExecutor * chore: handle keyProtoToCloudKey in CloudClientExecutor * style: as per plugin --------- Co-authored-by: rahul2393 --- .../executor/spanner/CloudClientExecutor.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java b/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java index f7fa02a995..08cda1a808 100644 --- a/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java +++ b/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java @@ -176,6 +176,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; @@ -2898,6 +2899,9 @@ private com.google.spanner.executor.v1.ValueList buildStruct(StructReader struct case DATE: value.setDateDaysValue(daysFromDate(struct.getDate(i))); break; + case UUID: + value.setStringValue(struct.getUuid(i).toString()); + break; case NUMERIC: String ascii = struct.getBigDecimal(i).toPlainString(); value.setStringValue(ascii); @@ -3044,6 +3048,25 @@ private com.google.spanner.executor.v1.ValueList buildStruct(StructReader struct com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.DATE).build()); } break; + case UUID: + { + com.google.spanner.executor.v1.ValueList.Builder builder = + com.google.spanner.executor.v1.ValueList.newBuilder(); + List values = struct.getUuidList(i); + for (UUID uuidValue : values) { + com.google.spanner.executor.v1.Value.Builder valueProto = + com.google.spanner.executor.v1.Value.newBuilder(); + if (uuidValue == null) { + builder.addValue(valueProto.setIsNull(true).build()); + } else { + builder.addValue(valueProto.setStringValue(uuidValue.toString()).build()); + } + } + value.setArrayValue(builder.build()); + value.setArrayType( + com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build()); + } + break; case TIMESTAMP: { com.google.spanner.executor.v1.ValueList.Builder builder = @@ -3227,6 +3250,7 @@ private static com.google.cloud.spanner.Key keyProtoToCloudKey( case BYTES: case FLOAT64: case DATE: + case UUID: case TIMESTAMP: case NUMERIC: case JSON: @@ -3260,6 +3284,8 @@ private static com.google.cloud.spanner.Key keyProtoToCloudKey( if (type.getCode() == TypeCode.NUMERIC) { String ascii = part.getStringValue(); cloudKey.append(new BigDecimal(ascii)); + } else if (type.getCode() == TypeCode.UUID) { + cloudKey.append(UUID.fromString(part.getStringValue())); } else { cloudKey.append(part.getStringValue()); } @@ -3314,6 +3340,9 @@ private static com.google.cloud.spanner.Value valueProtoToCloudValue( case DATE: return com.google.cloud.spanner.Value.date( value.hasIsNull() ? null : dateFromDays(value.getDateDaysValue())); + case UUID: + return com.google.cloud.spanner.Value.uuid( + value.hasIsNull() ? null : UUID.fromString(value.getStringValue())); case NUMERIC: { if (value.hasIsNull()) { @@ -3438,6 +3467,20 @@ private static com.google.cloud.spanner.Value valueProtoToCloudValue( .collect(Collectors.toList()), CloudClientExecutor::dateFromDays)); } + case UUID: + if (value.hasIsNull()) { + return com.google.cloud.spanner.Value.uuidArray(null); + } else { + return com.google.cloud.spanner.Value.uuidArray( + unmarshallValueList( + value.getArrayValue().getValueList().stream() + .map(com.google.spanner.executor.v1.Value::getIsNull) + .collect(Collectors.toList()), + value.getArrayValue().getValueList().stream() + .map(com.google.spanner.executor.v1.Value::getStringValue) + .collect(Collectors.toList()), + UUID::fromString)); + } case NUMERIC: { if (value.hasIsNull()) { @@ -3603,6 +3646,8 @@ private static com.google.cloud.spanner.Type typeProtoToCloudType( return com.google.cloud.spanner.Type.float64(); case DATE: return com.google.cloud.spanner.Type.date(); + case UUID: + return com.google.cloud.spanner.Type.uuid(); case TIMESTAMP: return com.google.cloud.spanner.Type.timestamp(); case NUMERIC: @@ -3659,6 +3704,8 @@ private static com.google.spanner.v1.Type cloudTypeToTypeProto(@Nonnull Type clo return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.TIMESTAMP).build(); case DATE: return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.DATE).build(); + case UUID: + return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.UUID).build(); case NUMERIC: return com.google.spanner.v1.Type.newBuilder().setCode(TypeCode.NUMERIC).build(); case PG_NUMERIC: From 7e419ce552e9e776610e3682587cc7b3324a5df3 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 18:20:24 +0000 Subject: [PATCH 24/25] chore(main): release 6.93.1-SNAPSHOT (#3864) :robot: I have created a release *beep* *boop* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). --- 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 +++++++++---------- 15 files changed, 51 insertions(+), 51 deletions(-) diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 0abf037b8c..deee9a5ee5 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -24,7 +24,7 @@ com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 93d7f92ee0..3e61f186a1 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.93.0 + 6.93.1-SNAPSHOT pom com.google.cloud @@ -53,43 +53,43 @@ com.google.cloud google-cloud-spanner - 6.93.0 + 6.93.1-SNAPSHOT com.google.cloud google-cloud-spanner test-jar - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.93.0 + 6.93.1-SNAPSHOT
diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index 7908421b97..eb754408bb 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.93.0 + 6.93.1-SNAPSHOT jar Google Cloud Spanner Executor com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 92e047813a..1de24c21c6 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.93.0 + 6.93.1-SNAPSHOT jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-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 7cd4a0fccc..ffab007ac8 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.93.0 + 6.93.1-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.93.0 + 6.93.1-SNAPSHOT diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index 2b975d7454..1ac0f904fa 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.93.0 + 6.93.1-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.93.0 + 6.93.1-SNAPSHOT diff --git a/grpc-google-cloud-spanner-executor-v1/pom.xml b/grpc-google-cloud-spanner-executor-v1/pom.xml index dde2f322b5..72b93fe0a0 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.93.0 + 6.93.1-SNAPSHOT grpc-google-cloud-spanner-executor-v1 GRPC library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index 4124710366..5068d9f5c6 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.93.0 + 6.93.1-SNAPSHOT grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 20e68e08c0..3d0a51e794 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 6.93.0 + 6.93.1-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.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.93.0 + 6.93.1-SNAPSHOT com.google.cloud google-cloud-spanner - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index 435770f1fc..bbe9f8912f 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.93.0 + 6.93.1-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.93.0 + 6.93.1-SNAPSHOT diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index bf9c63ccd2..1952aa4afb 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.93.0 + 6.93.1-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.93.0 + 6.93.1-SNAPSHOT diff --git a/proto-google-cloud-spanner-executor-v1/pom.xml b/proto-google-cloud-spanner-executor-v1/pom.xml index 1cf10ea4ff..a8f7eba099 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.93.0 + 6.93.1-SNAPSHOT proto-google-cloud-spanner-executor-v1 Proto library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index ff578e8653..f7ecbb58ca 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.93.0 + 6.93.1-SNAPSHOT proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 5fb9361d00..63f28bb200 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -32,7 +32,7 @@ com.google.cloud google-cloud-spanner - 6.93.0 + 6.93.1-SNAPSHOT diff --git a/versions.txt b/versions.txt index 41c52cc254..35aa969add 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.93.0:6.93.0 -proto-google-cloud-spanner-v1:6.93.0:6.93.0 -proto-google-cloud-spanner-admin-database-v1:6.93.0:6.93.0 -grpc-google-cloud-spanner-v1:6.93.0:6.93.0 -grpc-google-cloud-spanner-admin-instance-v1:6.93.0:6.93.0 -grpc-google-cloud-spanner-admin-database-v1:6.93.0:6.93.0 -google-cloud-spanner:6.93.0:6.93.0 -google-cloud-spanner-executor:6.93.0:6.93.0 -proto-google-cloud-spanner-executor-v1:6.93.0:6.93.0 -grpc-google-cloud-spanner-executor-v1:6.93.0:6.93.0 +proto-google-cloud-spanner-admin-instance-v1:6.93.0:6.93.1-SNAPSHOT +proto-google-cloud-spanner-v1:6.93.0:6.93.1-SNAPSHOT +proto-google-cloud-spanner-admin-database-v1:6.93.0:6.93.1-SNAPSHOT +grpc-google-cloud-spanner-v1:6.93.0:6.93.1-SNAPSHOT +grpc-google-cloud-spanner-admin-instance-v1:6.93.0:6.93.1-SNAPSHOT +grpc-google-cloud-spanner-admin-database-v1:6.93.0:6.93.1-SNAPSHOT +google-cloud-spanner:6.93.0:6.93.1-SNAPSHOT +google-cloud-spanner-executor:6.93.0:6.93.1-SNAPSHOT +proto-google-cloud-spanner-executor-v1:6.93.0:6.93.1-SNAPSHOT +grpc-google-cloud-spanner-executor-v1:6.93.0:6.93.1-SNAPSHOT From 9ac9e817272a25b3c25d565e13a4cbe8f298f4a0 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 19:48:10 +0530 Subject: [PATCH 25/25] chore(main): release 6.94.0 (#3889) * chore(main): release 6.94.0 * chore: generate libraries at Wed May 21 18:21:15 UTC 2025 --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cloud-java-bot --- CHANGELOG.md | 29 +++++++++++++++++++ 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 ++++++------- 17 files changed, 83 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68989f1bc6..ab2077e3d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Changelog +## [6.94.0](https://github.com/googleapis/java-spanner/compare/v6.93.0...v6.94.0) (2025-05-21) + + +### Features + +* Add throughput_mode to UpdateDatabaseDdlRequest to be used by Spanner Migration Tool. See https://github.com/GoogleCloudPlatform/spanner-migration-tool ([3070f1d](https://github.com/googleapis/java-spanner/commit/3070f1db97788c2a55c553ab8a4de3419d1ccf5c)) + + +### Bug Fixes + +* **deps:** Update the Java code generator (gapic-generator-java) to 2.58.0 ([3070f1d](https://github.com/googleapis/java-spanner/commit/3070f1db97788c2a55c553ab8a4de3419d1ccf5c)) +* Remove trailing semicolons in DDL ([#3879](https://github.com/googleapis/java-spanner/issues/3879)) ([ca3a67d](https://github.com/googleapis/java-spanner/commit/ca3a67db715f398943382df1f8a9979905811ff8)) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.48.0 ([#3869](https://github.com/googleapis/java-spanner/issues/3869)) ([afa17f7](https://github.com/googleapis/java-spanner/commit/afa17f73beab80639467916bc73b5c96305093aa)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.48.0 ([#3880](https://github.com/googleapis/java-spanner/issues/3880)) ([f3b00b6](https://github.com/googleapis/java-spanner/commit/f3b00b663aa897fda1bc21222d29726e6be630cb)) +* Update dependency com.google.cloud.opentelemetry:exporter-metrics to v0.34.0 ([#3861](https://github.com/googleapis/java-spanner/issues/3861)) ([676b14f](https://github.com/googleapis/java-spanner/commit/676b14f916dea783b40ddec4061bd7af157b5d98)) +* Update dependency commons-io:commons-io to v2.19.0 ([#3863](https://github.com/googleapis/java-spanner/issues/3863)) ([80a6af8](https://github.com/googleapis/java-spanner/commit/80a6af836ca29ec196a2f509831e1d36c557168f)) +* Update dependency io.opentelemetry:opentelemetry-bom to v1.50.0 ([#3865](https://github.com/googleapis/java-spanner/issues/3865)) ([ae63050](https://github.com/googleapis/java-spanner/commit/ae6305089b394be0c1eaf8ff7e188711288d87ad)) +* Update googleapis/sdk-platform-java action to v2.58.0 ([#3870](https://github.com/googleapis/java-spanner/issues/3870)) ([d1e45fa](https://github.com/googleapis/java-spanner/commit/d1e45fa88bb005529bcfb2a6ff2df44065be0fd2)) +* Update opentelemetry.version to v1.50.0 ([#3866](https://github.com/googleapis/java-spanner/issues/3866)) ([f7e09b8](https://github.com/googleapis/java-spanner/commit/f7e09b8148c0e51503255694bd3347c637724b34)) + + +### Documentation + +* Add samples for unnamed (positional) parameters ([#3849](https://github.com/googleapis/java-spanner/issues/3849)) ([035cadd](https://github.com/googleapis/java-spanner/commit/035cadd5bb77a8f9f6fb25ac8c8e5a3e186d9a22)) + ## [6.93.0](https://github.com/googleapis/java-spanner/compare/v6.92.0...v6.93.0) (2025-05-09) diff --git a/README.md b/README.md index c52608bfba..d09cf10429 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.93.0' +implementation 'com.google.cloud:google-cloud-spanner:6.94.0' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.93.0" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner" % "6.94.0" ``` ## Authentication @@ -729,7 +729,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.93.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-spanner/6.94.0 [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 deee9a5ee5..c3ad2195e4 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -24,7 +24,7 @@ com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index 3e61f186a1..6b1ffa683c 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.93.1-SNAPSHOT + 6.94.0 pom com.google.cloud @@ -53,43 +53,43 @@ com.google.cloud google-cloud-spanner - 6.93.1-SNAPSHOT + 6.94.0 com.google.cloud google-cloud-spanner test-jar - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index eb754408bb..73611071a6 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.93.1-SNAPSHOT + 6.94.0 jar Google Cloud Spanner Executor com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 1de24c21c6..3f352f9118 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.93.1-SNAPSHOT + 6.94.0 jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.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 ffab007ac8..ce01db18e0 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.93.1-SNAPSHOT + 6.94.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.93.1-SNAPSHOT + 6.94.0 diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index 1ac0f904fa..c6e3e9860e 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.93.1-SNAPSHOT + 6.94.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.93.1-SNAPSHOT + 6.94.0 diff --git a/grpc-google-cloud-spanner-executor-v1/pom.xml b/grpc-google-cloud-spanner-executor-v1/pom.xml index 72b93fe0a0..290acc16ed 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.93.1-SNAPSHOT + 6.94.0 grpc-google-cloud-spanner-executor-v1 GRPC library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index 5068d9f5c6..d26ce227a2 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.93.1-SNAPSHOT + 6.94.0 grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/pom.xml b/pom.xml index 3d0a51e794..a2075f1ac4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 6.93.1-SNAPSHOT + 6.94.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.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.93.1-SNAPSHOT + 6.94.0 com.google.cloud google-cloud-spanner - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index bbe9f8912f..931beff968 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.93.1-SNAPSHOT + 6.94.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.93.1-SNAPSHOT + 6.94.0 diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index 1952aa4afb..6db2494d4d 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.93.1-SNAPSHOT + 6.94.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.93.1-SNAPSHOT + 6.94.0 diff --git a/proto-google-cloud-spanner-executor-v1/pom.xml b/proto-google-cloud-spanner-executor-v1/pom.xml index a8f7eba099..5f52c82f5a 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.93.1-SNAPSHOT + 6.94.0 proto-google-cloud-spanner-executor-v1 Proto library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index f7ecbb58ca..3467a0b42c 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.93.1-SNAPSHOT + 6.94.0 proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 63f28bb200..6362fc44af 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -32,7 +32,7 @@ com.google.cloud google-cloud-spanner - 6.93.1-SNAPSHOT + 6.94.0 diff --git a/versions.txt b/versions.txt index 35aa969add..067002c8e0 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.93.0:6.93.1-SNAPSHOT -proto-google-cloud-spanner-v1:6.93.0:6.93.1-SNAPSHOT -proto-google-cloud-spanner-admin-database-v1:6.93.0:6.93.1-SNAPSHOT -grpc-google-cloud-spanner-v1:6.93.0:6.93.1-SNAPSHOT -grpc-google-cloud-spanner-admin-instance-v1:6.93.0:6.93.1-SNAPSHOT -grpc-google-cloud-spanner-admin-database-v1:6.93.0:6.93.1-SNAPSHOT -google-cloud-spanner:6.93.0:6.93.1-SNAPSHOT -google-cloud-spanner-executor:6.93.0:6.93.1-SNAPSHOT -proto-google-cloud-spanner-executor-v1:6.93.0:6.93.1-SNAPSHOT -grpc-google-cloud-spanner-executor-v1:6.93.0:6.93.1-SNAPSHOT +proto-google-cloud-spanner-admin-instance-v1:6.94.0:6.94.0 +proto-google-cloud-spanner-v1:6.94.0:6.94.0 +proto-google-cloud-spanner-admin-database-v1:6.94.0:6.94.0 +grpc-google-cloud-spanner-v1:6.94.0:6.94.0 +grpc-google-cloud-spanner-admin-instance-v1:6.94.0:6.94.0 +grpc-google-cloud-spanner-admin-database-v1:6.94.0:6.94.0 +google-cloud-spanner:6.94.0:6.94.0 +google-cloud-spanner-executor:6.94.0:6.94.0 +proto-google-cloud-spanner-executor-v1:6.94.0:6.94.0 +grpc-google-cloud-spanner-executor-v1:6.94.0:6.94.0