diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 46b80edc1c7..35aa3b151d6 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.49.0 + - uses: googleapis/sdk-platform-java/.github/scripts@v2.50.0 if: env.SHOULD_RUN == 'true' with: base_ref: ${{ github.base_ref }} diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 2b4010cab6f..f5298fed0f2 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.39.0 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.40.0 with: bom-path: google-cloud-spanner-bom/pom.xml diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg index 5f84dd393a1..82ed3a43e49 100644 --- a/.kokoro/presubmit/graalvm-native-17.cfg +++ b/.kokoro/presubmit/graalvm-native-17.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.39.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.40.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native.cfg b/.kokoro/presubmit/graalvm-native.cfg index 418a399b759..a836c97f04b 100644 --- a/.kokoro/presubmit/graalvm-native.cfg +++ b/.kokoro/presubmit/graalvm-native.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.39.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.40.0" } env_vars: { diff --git a/CHANGELOG.md b/CHANGELOG.md index d4aecbac2d2..395574d2ab1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [6.81.2](https://github.com/googleapis/java-spanner/compare/v6.81.1...v6.81.2) (2024-11-20) + + +### Bug Fixes + +* Directpath enabled attribute ([#3477](https://github.com/googleapis/java-spanner/issues/3477)) ([ea1ebad](https://github.com/googleapis/java-spanner/commit/ea1ebadd1ef5d2a343e7117828cae71a798c38eb)) + + +### Dependencies + +* Update dependency com.google.api.grpc:proto-google-cloud-monitoring-v3 to v3.55.0 ([#3482](https://github.com/googleapis/java-spanner/issues/3482)) ([bf350b0](https://github.com/googleapis/java-spanner/commit/bf350b024592312b0a00a04c2ab6d3d2312ea686)) +* Update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.53.0 ([#3454](https://github.com/googleapis/java-spanner/issues/3454)) ([8729b30](https://github.com/googleapis/java-spanner/commit/8729b30a1043a7e77b0277036c70c7c2616d0b47)) +* Update dependency com.google.cloud:google-cloud-trace to v2.53.0 ([#3464](https://github.com/googleapis/java-spanner/issues/3464)) ([a507e4c](https://github.com/googleapis/java-spanner/commit/a507e4c89bb59d154881812f10cab02d68325a08)) +* Update dependency com.google.cloud:google-cloud-trace to v2.54.0 ([#3488](https://github.com/googleapis/java-spanner/issues/3488)) ([1d1fecf](https://github.com/googleapis/java-spanner/commit/1d1fecf04a4e800c9b756324914cb1feed7c9866)) +* Update googleapis/sdk-platform-java action to v2.50.0 ([#3475](https://github.com/googleapis/java-spanner/issues/3475)) ([e992f18](https://github.com/googleapis/java-spanner/commit/e992f18a651ec034b89aa214cb87ec43f33f2f79)) +* Update sdk platform java dependencies ([#3476](https://github.com/googleapis/java-spanner/issues/3476)) ([acb6446](https://github.com/googleapis/java-spanner/commit/acb6446cb952bdbc54ca1b6c53dc466c72cb55b0)) + ## [6.81.1](https://github.com/googleapis/java-spanner/compare/v6.81.0...v6.81.1) (2024-11-11) diff --git a/README.md b/README.md index 4e1fbea168f..294ac252fd3 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-spanner - 6.81.0 + 6.81.1 ``` @@ -516,6 +516,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-spanner/tree/ | Create Instance Partition Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CreateInstancePartitionSample.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/CreateInstancePartitionSample.java) | | Create Instance With Autoscaling Config Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CreateInstanceWithAutoscalingConfigExample.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/CreateInstanceWithAutoscalingConfigExample.java) | | Create Instance With Processing Units Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CreateInstanceWithProcessingUnitsExample.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/CreateInstanceWithProcessingUnitsExample.java) | +| Create Instance Without Default Backup Schedules Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CreateInstanceWithoutDefaultBackupSchedulesExample.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/CreateInstanceWithoutDefaultBackupSchedulesExample.java) | | Create Sequence Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CreateSequenceSample.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/CreateSequenceSample.java) | | Create Table With Foreign Key Delete Cascade Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CreateTableWithForeignKeyDeleteCascadeSample.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/CreateTableWithForeignKeyDeleteCascadeSample.java) | | Custom Timeout And Retry Settings Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/CustomTimeoutAndRetrySettingsExample.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/CustomTimeoutAndRetrySettingsExample.java) | @@ -571,6 +572,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-spanner/tree/ | 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) | | Update Instance Config Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateInstanceConfigSample.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/UpdateInstanceConfigSample.java) | +| Update Instance Default Backup Schedule Type Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateInstanceDefaultBackupScheduleTypeExample.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/UpdateInstanceDefaultBackupScheduleTypeExample.java) | | Update Instance Example | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateInstanceExample.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/UpdateInstanceExample.java) | | Update Json Data Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateJsonDataSample.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/UpdateJsonDataSample.java) | | Update Jsonb Data Sample | [source code](https://github.com/googleapis/java-spanner/blob/main/samples/snippets/src/main/java/com/example/spanner/UpdateJsonbDataSample.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/UpdateJsonbDataSample.java) | diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index a94cd89a40f..bfb403e8b5f 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -24,7 +24,7 @@ com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 @@ -92,7 +92,7 @@ com.google.cloud google-cloud-spanner - 6.81.0 + 6.81.1 commons-cli diff --git a/google-cloud-spanner-bom/pom.xml b/google-cloud-spanner-bom/pom.xml index c07ccbe30a4..e3daac22258 100644 --- a/google-cloud-spanner-bom/pom.xml +++ b/google-cloud-spanner-bom/pom.xml @@ -3,12 +3,12 @@ 4.0.0 com.google.cloud google-cloud-spanner-bom - 6.81.1 + 6.81.2 pom com.google.cloud sdk-platform-java-config - 3.39.0 + 3.40.0 Google Cloud Spanner BOM @@ -53,43 +53,43 @@ com.google.cloud google-cloud-spanner - 6.81.1 + 6.81.2 com.google.cloud google-cloud-spanner test-jar - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.81.1 + 6.81.2 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.81.1 + 6.81.2 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.81.1 + 6.81.2 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.81.1 + 6.81.2 diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index e0113c09aec..6aaf0ad73c1 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.81.1 + 6.81.2 jar Google Cloud Spanner Executor com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 @@ -54,7 +54,7 @@ com.google.cloud google-cloud-trace - 2.52.0 + 2.53.0 io.grpc @@ -127,7 +127,7 @@ com.google.api.grpc proto-google-cloud-trace-v1 - 2.52.0 + 2.53.0 com.google.api.grpc 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 714dbc309cc..481d95884ce 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 @@ -623,10 +623,12 @@ public synchronized Status startBatchTxn( } catch (SpannerException e) { return sender.finishWithError(toStatus(e)); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unexpected error: " + e.getMessage()); return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, + CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -730,7 +732,8 @@ public synchronized Status finish(Mode finishMode, OutcomeSender sender) { return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, + CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.sendOutcome(outcomeBuilder.build()); } else if (batchTxn != null) { @@ -1075,7 +1078,7 @@ private Status executeAction( return outcomeSender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } finally { scope.close(); span.end(); @@ -1171,7 +1174,7 @@ private Status executeAdminAction( return outcomeSender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1260,7 +1263,7 @@ private Status executeUpdateCloudInstance( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1282,7 +1285,7 @@ private Status executeDeleteCloudInstance( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1330,7 +1333,7 @@ private Status executeListCloudInstances( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1374,7 +1377,7 @@ private Status executeListCloudInstanceConfigs( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1405,7 +1408,7 @@ private Status executeGetCloudInstanceConfig( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1436,7 +1439,7 @@ private Status executeGetCloudInstance( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1466,7 +1469,7 @@ private Status executeCreateUserInstanceConfig( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1486,7 +1489,7 @@ private Status executeDeleteUserInstanceConfig( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1515,7 +1518,7 @@ private Status executeCreateCloudCustomEncryptedDatabase( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1550,7 +1553,7 @@ private Status executeCreateCloudDatabase( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1584,7 +1587,7 @@ private Status executeUpdateCloudDatabaseDdl( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1605,7 +1608,7 @@ private Status executeDropCloudDatabase( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } return sender.finishWithOK(); } @@ -1642,7 +1645,7 @@ private Status executeCreateCloudBackup( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1678,7 +1681,7 @@ private Status executeCopyCloudBackup( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1709,7 +1712,7 @@ private Status executeGetCloudBackup( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1743,7 +1746,7 @@ private Status executeUpdateCloudBackup( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1763,7 +1766,7 @@ private Status executeDeleteCloudBackup( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1803,7 +1806,7 @@ private Status executeListCloudBackups( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1840,7 +1843,7 @@ private Status executeListCloudBackupOperations( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1879,7 +1882,7 @@ private Status executeListCloudDatabases( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1918,7 +1921,7 @@ private Status executeListCloudDatabaseOperations( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1952,7 +1955,7 @@ private Status executeRestoreCloudDatabase( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -1983,7 +1986,7 @@ private Status executeGetCloudDatabase( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2011,7 +2014,7 @@ private Status executeGetOperation( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2030,7 +2033,7 @@ private Status executeCancelOperation( return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2120,10 +2123,11 @@ private Status executeGenerateDbPartitionsRead( LOGGER.log(Level.WARNING, String.format("GenerateDbPartitionsRead failed for %s", action)); return sender.finishWithError(toStatus(e)); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unexpected error: " + e.getMessage()); return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2166,10 +2170,11 @@ private Status executeGenerateDbPartitionsQuery( LOGGER.log(Level.WARNING, String.format("GenerateDbPartitionsQuery failed for %s", action)); return sender.finishWithError(toStatus(e)); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unexpected error: " + e.getMessage()); return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2198,10 +2203,11 @@ private Status executeExecutePartition( } catch (SpannerException e) { return sender.finishWithError(toStatus(e)); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unexpected error: " + e.getMessage()); return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2225,10 +2231,11 @@ private Status executePartitionedUpdate( } catch (SpannerException e) { return sender.finishWithError(toStatus(e)); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unexpected error: " + e.getMessage()); return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } @@ -2478,10 +2485,11 @@ private Status executeStartTxn( } catch (SpannerException e) { return sender.finishWithError(toStatus(e)); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unexpected error: " + e.getMessage()); return sender.finishWithError( toStatus( SpannerExceptionFactory.newSpannerException( - ErrorCode.INVALID_ARGUMENT, "Unexpected error: " + e.getMessage()))); + ErrorCode.INVALID_ARGUMENT, CloudClientExecutor.unexpectedExceptionResponse(e)))); } } diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 69d0f82b034..845e8bfeef8 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.81.1 + 6.81.2 jar Google Cloud Spanner https://github.com/googleapis/java-spanner @@ -11,7 +11,7 @@ com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 google-cloud-spanner @@ -270,7 +270,7 @@ com.google.api.grpc proto-google-cloud-monitoring-v3 - 3.54.0 + 3.55.0 com.google.auth diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BuiltInOpenTelemetryMetricsProvider.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BuiltInOpenTelemetryMetricsProvider.java index ef1d70eec25..9367c45b636 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BuiltInOpenTelemetryMetricsProvider.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BuiltInOpenTelemetryMetricsProvider.java @@ -20,7 +20,6 @@ import static com.google.cloud.spanner.BuiltInMetricsConstant.CLIENT_HASH_KEY; import static com.google.cloud.spanner.BuiltInMetricsConstant.CLIENT_NAME_KEY; import static com.google.cloud.spanner.BuiltInMetricsConstant.CLIENT_UID_KEY; -import static com.google.cloud.spanner.BuiltInMetricsConstant.DIRECT_PATH_ENABLED_KEY; import static com.google.cloud.spanner.BuiltInMetricsConstant.INSTANCE_CONFIG_ID_KEY; import static com.google.cloud.spanner.BuiltInMetricsConstant.LOCATION_ID_KEY; import static com.google.cloud.spanner.BuiltInMetricsConstant.PROJECT_ID_KEY; @@ -83,8 +82,6 @@ Map createClientAttributes(String projectId, String client_name) Map clientAttributes = new HashMap<>(); clientAttributes.put(LOCATION_ID_KEY.getKey(), detectClientLocation()); clientAttributes.put(PROJECT_ID_KEY.getKey(), projectId); - // TODO: Replace this with real value. - clientAttributes.put(DIRECT_PATH_ENABLED_KEY.getKey(), "false"); clientAttributes.put(INSTANCE_CONFIG_ID_KEY.getKey(), "unknown"); clientAttributes.put(CLIENT_NAME_KEY.getKey(), client_name); String clientUid = getDefaultTaskValue(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java index 2360b5d5173..fe23b097982 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java @@ -29,6 +29,7 @@ import com.google.api.gax.grpc.GrpcCallContext; import com.google.api.gax.grpc.GrpcCallSettings; import com.google.api.gax.grpc.GrpcStubCallableFactory; +import com.google.api.gax.grpc.GrpcTransportChannel; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.longrunning.OperationFuture; import com.google.api.gax.retrying.ResultRetryAlgorithm; @@ -78,13 +79,14 @@ import com.google.cloud.spanner.admin.instance.v1.stub.InstanceAdminStub; import com.google.cloud.spanner.admin.instance.v1.stub.InstanceAdminStubSettings; import com.google.cloud.spanner.encryption.EncryptionConfigProtoMapper; -import com.google.cloud.spanner.v1.stub.GrpcSpannerStub; import com.google.cloud.spanner.v1.stub.SpannerStub; import com.google.cloud.spanner.v1.stub.SpannerStubSettings; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.io.Resources; @@ -276,6 +278,8 @@ public class GapicSpannerRpc implements SpannerRpc { private final int numChannels; private final boolean isGrpcGcpExtensionEnabled; + private Supplier directPathEnabledSupplier = () -> false; + public static GapicSpannerRpc create(SpannerOptions options) { return new GapicSpannerRpc(options); } @@ -351,7 +355,9 @@ public GapicSpannerRpc(final SpannerOptions options) { SpannerInterceptorProvider.create( MoreObjects.firstNonNull( options.getInterceptorProvider(), - SpannerInterceptorProvider.createDefault(options.getOpenTelemetry()))) + SpannerInterceptorProvider.createDefault( + options.getOpenTelemetry(), + (() -> directPathEnabledSupplier.get())))) // This sets the trace context headers. .withTraceContext(endToEndTracingEnabled, options.getOpenTelemetry()) // This sets the response compressor (Server -> Client). @@ -396,18 +402,27 @@ public GapicSpannerRpc(final SpannerOptions options) { final String emulatorHost = System.getenv("SPANNER_EMULATOR_HOST"); try { + SpannerStubSettings spannerStubSettings = + options + .getSpannerStubSettings() + .toBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .setStreamWatchdogProvider(watchdogProvider) + .setTracerFactory( + options.getApiTracerFactory( + /* isAdminClient = */ false, isEmulatorEnabled(options, emulatorHost))) + .build(); + ClientContext clientContext = ClientContext.create(spannerStubSettings); this.spannerStub = - GrpcSpannerStub.create( - options - .getSpannerStubSettings() - .toBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .setStreamWatchdogProvider(watchdogProvider) - .setTracerFactory( - options.getApiTracerFactory( - /* isAdminClient = */ false, isEmulatorEnabled(options, emulatorHost))) - .build()); + GrpcSpannerStubWithStubSettingsAndClientContext.create( + spannerStubSettings, clientContext); + this.directPathEnabledSupplier = + Suppliers.memoize( + () -> { + return ((GrpcTransportChannel) clientContext.getTransportChannel()).isDirectPath() + && isAttemptDirectPathXds; + }); this.readRetrySettings = options.getSpannerStubSettings().streamingReadSettings().getRetrySettings(); this.readRetryableCodes = @@ -455,7 +470,8 @@ public GapicSpannerRpc(final SpannerOptions options) { .getStreamWatchdogProvider() .withCheckInterval(pdmlSettings.getStreamWatchdogCheckInterval())); } - this.partitionedDmlStub = GrpcSpannerStub.create(pdmlSettings.build()); + this.partitionedDmlStub = + GrpcSpannerStubWithStubSettingsAndClientContext.create(pdmlSettings.build()); this.instanceAdminStubSettings = options .getInstanceAdminStubSettings() diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GrpcSpannerStubWithStubSettingsAndClientContext.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GrpcSpannerStubWithStubSettingsAndClientContext.java new file mode 100644 index 00000000000..6c575e1074c --- /dev/null +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GrpcSpannerStubWithStubSettingsAndClientContext.java @@ -0,0 +1,40 @@ +/* + * Copyright 2024 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.spi.v1; + +import com.google.api.gax.rpc.ClientContext; +import com.google.cloud.spanner.v1.stub.GrpcSpannerStub; +import com.google.cloud.spanner.v1.stub.SpannerStubSettings; +import java.io.IOException; + +/** + * Wrapper around {@link GrpcSpannerStub} to make the constructor available inside this package. + * This makes it possible to create a {@link GrpcSpannerStub} with a {@link SpannerStubSettings} and + * a {@link ClientContext}. + */ +class GrpcSpannerStubWithStubSettingsAndClientContext extends GrpcSpannerStub { + + static final GrpcSpannerStubWithStubSettingsAndClientContext create( + SpannerStubSettings settings, ClientContext clientContext) throws IOException { + return new GrpcSpannerStubWithStubSettingsAndClientContext(settings, clientContext); + } + + protected GrpcSpannerStubWithStubSettingsAndClientContext( + SpannerStubSettings settings, ClientContext clientContext) throws IOException { + super(settings, clientContext); + } +} diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java index dd414bed397..026f9b4ca9d 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java @@ -28,6 +28,7 @@ import com.google.cloud.spanner.CompositeTracer; import com.google.cloud.spanner.SpannerExceptionFactory; import com.google.cloud.spanner.SpannerRpcMetrics; +import com.google.common.base.Supplier; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.spanner.admin.database.v1.DatabaseName; @@ -93,8 +94,12 @@ class HeaderInterceptor implements ClientInterceptor { private static final Level LEVEL = Level.INFO; private final SpannerRpcMetrics spannerRpcMetrics; - HeaderInterceptor(SpannerRpcMetrics spannerRpcMetrics) { + private final Supplier directPathEnabledSupplier; + + HeaderInterceptor( + SpannerRpcMetrics spannerRpcMetrics, Supplier directPathEnabledSupplier) { this.spannerRpcMetrics = spannerRpcMetrics; + this.directPathEnabledSupplier = directPathEnabledSupplier; } @Override @@ -228,6 +233,9 @@ private Map getBuiltInMetricAttributes(String key, DatabaseName attributes.put(BuiltInMetricsConstant.DATABASE_KEY.getKey(), databaseName.getDatabase()); attributes.put( BuiltInMetricsConstant.INSTANCE_ID_KEY.getKey(), databaseName.getInstance()); + attributes.put( + BuiltInMetricsConstant.DIRECT_PATH_ENABLED_KEY.getKey(), + String.valueOf(this.directPathEnabledSupplier.get())); return attributes; }); } diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/SpannerInterceptorProvider.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/SpannerInterceptorProvider.java index b4d28ef0789..c3c05b8af15 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/SpannerInterceptorProvider.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/SpannerInterceptorProvider.java @@ -19,6 +19,8 @@ import com.google.api.core.ObsoleteApi; import com.google.api.gax.grpc.GrpcInterceptorProvider; import com.google.cloud.spanner.SpannerRpcMetrics; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import io.grpc.ClientInterceptor; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -46,11 +48,22 @@ public static SpannerInterceptorProvider createDefault() { } public static SpannerInterceptorProvider createDefault(OpenTelemetry openTelemetry) { + return createDefault( + openTelemetry, + Suppliers.memoize( + () -> { + return false; + })); + } + + public static SpannerInterceptorProvider createDefault( + OpenTelemetry openTelemetry, Supplier directPathEnabledSupplier) { List defaultInterceptorList = new ArrayList<>(); defaultInterceptorList.add(new SpannerErrorInterceptor()); defaultInterceptorList.add( new LoggingInterceptor(Logger.getLogger(GapicSpannerRpc.class.getName()), Level.FINER)); - defaultInterceptorList.add(new HeaderInterceptor(new SpannerRpcMetrics(openTelemetry))); + defaultInterceptorList.add( + new HeaderInterceptor(new SpannerRpcMetrics(openTelemetry), directPathEnabledSupplier)); return new SpannerInterceptorProvider(ImmutableList.copyOf(defaultInterceptorList)); } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java index b493e36c966..9f65402c31f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java @@ -94,7 +94,6 @@ public static void setup() { Attributes.builder() .put(BuiltInMetricsConstant.PROJECT_ID_KEY, "test-project") .put(BuiltInMetricsConstant.INSTANCE_CONFIG_ID_KEY, "unknown") - .put(BuiltInMetricsConstant.DIRECT_PATH_ENABLED_KEY, "false") .put( BuiltInMetricsConstant.LOCATION_ID_KEY, BuiltInOpenTelemetryMetricsProvider.detectClientLocation()) diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml index 92dc688e75f..547eacd5466 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.81.1 + 6.81.2 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.81.1 + 6.81.2 diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml index eb834047b1e..c7b56a096b2 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.81.1 + 6.81.2 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.81.1 + 6.81.2 diff --git a/grpc-google-cloud-spanner-executor-v1/pom.xml b/grpc-google-cloud-spanner-executor-v1/pom.xml index 86d8ec3fa8c..673bdb94e30 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.81.1 + 6.81.2 grpc-google-cloud-spanner-executor-v1 GRPC library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml index 7a5e2be0a06..e78381e76dd 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.81.1 + 6.81.2 grpc-google-cloud-spanner-v1 GRPC library for grpc-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 diff --git a/pom.xml b/pom.xml index b1783c50cc4..191e70768a6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-spanner-parent pom - 6.81.1 + 6.81.2 Google Cloud Spanner Parent https://github.com/googleapis/java-spanner @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.39.0 + 3.40.0 @@ -61,47 +61,47 @@ com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 6.81.1 + 6.81.2 com.google.api.grpc proto-google-cloud-spanner-executor-v1 - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-executor-v1 - 6.81.1 + 6.81.2 com.google.api.grpc proto-google-cloud-spanner-v1 - 6.81.1 + 6.81.2 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-v1 - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 6.81.1 + 6.81.2 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 6.81.1 + 6.81.2 com.google.cloud google-cloud-spanner - 6.81.1 + 6.81.2 diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml index 39f837ed429..8213510c17f 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.81.1 + 6.81.2 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.81.1 + 6.81.2 diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml index b5ddad74e34..ce9de4c26db 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.81.1 + 6.81.2 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.81.1 + 6.81.2 diff --git a/proto-google-cloud-spanner-executor-v1/pom.xml b/proto-google-cloud-spanner-executor-v1/pom.xml index adcfaaefbdc..2f673705bb9 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.81.1 + 6.81.2 proto-google-cloud-spanner-executor-v1 Proto library for google-cloud-spanner com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml index f819a8f9ac2..bfc8d4b53b8 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.81.1 + 6.81.2 proto-google-cloud-spanner-v1 PROTO library for proto-google-cloud-spanner-v1 com.google.cloud google-cloud-spanner-parent - 6.81.1 + 6.81.2 diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index e8f4ddaf030..4de16e06367 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -23,7 +23,7 @@ 1.8 UTF-8 0.31.1 - 2.53.0 + 2.54.0 3.54.0 @@ -33,7 +33,7 @@ com.google.cloud google-cloud-spanner - 6.81.0 + 6.81.1 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index a5e65f1a696..d01e67da41d 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -23,7 +23,7 @@ 1.8 UTF-8 0.31.1 - 2.53.0 + 2.54.0 3.54.0 @@ -32,7 +32,7 @@ com.google.cloud google-cloud-spanner - 6.81.1 + 6.81.2 diff --git a/samples/snippets/src/main/java/com/example/spanner/CreateInstanceWithoutDefaultBackupSchedulesExample.java b/samples/snippets/src/main/java/com/example/spanner/CreateInstanceWithoutDefaultBackupSchedulesExample.java new file mode 100644 index 00000000000..ed370949699 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/spanner/CreateInstanceWithoutDefaultBackupSchedulesExample.java @@ -0,0 +1,77 @@ +/* + * Copyright 2024 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; + +// [START spanner_create_instance_without_default_backup_schedule] + +import com.google.cloud.spanner.Spanner; +import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.admin.instance.v1.InstanceAdminClient; +import com.google.spanner.admin.instance.v1.CreateInstanceRequest; +import com.google.spanner.admin.instance.v1.Instance; +import com.google.spanner.admin.instance.v1.InstanceConfigName; +import com.google.spanner.admin.instance.v1.ProjectName; +import java.util.concurrent.ExecutionException; + +class CreateInstanceWithoutDefaultBackupSchedulesExample { + + static void createInstanceWithoutDefaultBackupSchedules() { + // TODO(developer): Replace these variables before running the sample. + String projectId = "my-project"; + String instanceId = "my-instance"; + createInstanceWithoutDefaultBackupSchedules(projectId, instanceId); + } + + static void createInstanceWithoutDefaultBackupSchedules(String projectId, String instanceId) { + // Set Instance configuration. + int nodeCount = 2; + String displayName = "Descriptive name"; + + // Create an Instance object that will be used to create the instance. + Instance instance = + Instance.newBuilder() + .setDisplayName(displayName) + .setDefaultBackupScheduleType(Instance.DefaultBackupScheduleType.NONE) + .setNodeCount(nodeCount) + .setConfig(InstanceConfigName.of(projectId, "regional-us-east4").toString()) + .build(); + + try (Spanner spanner = + SpannerOptions.newBuilder().setProjectId(projectId).build().getService(); + InstanceAdminClient instanceAdminClient = spanner.createInstanceAdminClient()) { + + // Wait for the createInstance operation to finish. + Instance createdInstance = + instanceAdminClient + .createInstanceAsync( + CreateInstanceRequest.newBuilder() + .setParent(ProjectName.of(projectId).toString()) + .setInstanceId(instanceId) + .setInstance(instance) + .build()) + .get(); + System.out.printf("Instance %s was successfully created%n", createdInstance.getName()); + } catch (ExecutionException e) { + System.out.printf( + "Error: Creating instance %s failed with error message %s%n", + instance.getName(), e.getMessage()); + } catch (InterruptedException e) { + System.out.println("Error: Waiting for createInstance operation to finish was interrupted"); + } + } +} +// [END spanner_create_instance_without_default_backup_schedule] diff --git a/samples/snippets/src/main/java/com/example/spanner/UpdateInstanceDefaultBackupScheduleTypeExample.java b/samples/snippets/src/main/java/com/example/spanner/UpdateInstanceDefaultBackupScheduleTypeExample.java new file mode 100644 index 00000000000..39a456fe599 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/spanner/UpdateInstanceDefaultBackupScheduleTypeExample.java @@ -0,0 +1,82 @@ +/* + * Copyright 2024 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; + +// [START spanner_update_instance_default_backup_schedule_type] + +import com.google.cloud.spanner.Spanner; +import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.admin.instance.v1.InstanceAdminClient; +import com.google.common.collect.Lists; +import com.google.protobuf.FieldMask; +import com.google.spanner.admin.instance.v1.Instance; +import com.google.spanner.admin.instance.v1.InstanceConfigName; +import com.google.spanner.admin.instance.v1.InstanceName; +import com.google.spanner.admin.instance.v1.UpdateInstanceRequest; +import java.util.concurrent.ExecutionException; + +public class UpdateInstanceDefaultBackupScheduleTypeExample { + + static void updateInstanceDefaultBackupScheduleType() { + // TODO(developer): Replace these variables before running the sample. + String projectId = "my-project"; + String instanceId = "my-instance"; + updateInstanceDefaultBackupScheduleType(projectId, instanceId); + } + + static void updateInstanceDefaultBackupScheduleType(String projectId, String instanceId) { + // Set Instance configuration. + int nodeCount = 2; + String displayName = "Updated name"; + + // Update an Instance object that will be used to update the instance. + Instance instance = + Instance.newBuilder() + .setName(InstanceName.of(projectId, instanceId).toString()) + .setDisplayName(displayName) + .setNodeCount(nodeCount) + .setDefaultBackupScheduleType(Instance.DefaultBackupScheduleType.AUTOMATIC) + .setConfig(InstanceConfigName.of(projectId, "regional-us-east4").toString()) + .build(); + + try (Spanner spanner = + SpannerOptions.newBuilder().setProjectId(projectId).build().getService(); + InstanceAdminClient instanceAdminClient = spanner.createInstanceAdminClient()) { + + // Wait for the updatedInstance operation to finish. + Instance updatedInstance = + instanceAdminClient + .updateInstanceAsync( + UpdateInstanceRequest.newBuilder() + .setFieldMask( + FieldMask.newBuilder() + .addAllPaths(Lists.newArrayList("default_backup_schedule_type"))) + .setInstance(instance) + .build()) + .get(); + System.out.printf("Instance %s was successfully updated%n", updatedInstance.getName()); + } catch (ExecutionException e) { + System.out.printf( + "Error: Updating instance %s failed with error message %s%n", + instance.getName(), e.getMessage()); + } catch (InterruptedException e) { + System.out.println("Error: Waiting for updateInstance operation to finish was interrupted"); + } + } +} + +// [END spanner_update_instance_default_backup_schedule_type] diff --git a/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java b/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java index e0da1ca67f4..4e02f714e39 100644 --- a/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java +++ b/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java @@ -692,6 +692,38 @@ public void testCreateAndUpdateInstanceSample() { InstanceId.of(dbId.getInstanceId().getProject(), instanceId))); } + @Test + public void testCreateAndUpdateInstanceDefaultBackupScheduleTypeSample() { + String databaseId = idGenerator.generateDatabaseId(); + DatabaseId dbId = DatabaseId.of(projectId, instanceId, databaseId); + + String instanceId = formatForTest("sample-inst"); + String out = + runSampleRunnable( + () -> { + try { + CreateInstanceWithoutDefaultBackupSchedulesExample + .createInstanceWithoutDefaultBackupSchedules( + dbId.getInstanceId().getProject(), instanceId); + UpdateInstanceDefaultBackupScheduleTypeExample + .updateInstanceDefaultBackupScheduleType( + dbId.getInstanceId().getProject(), instanceId); + } finally { + spanner.getInstanceAdminClient().deleteInstance(instanceId); + } + }); + assertThat(out) + .contains( + String.format( + "Instance %s was successfully created", + InstanceId.of(dbId.getInstanceId().getProject(), instanceId))); + assertThat(out) + .contains( + String.format( + "Instance %s was successfully updated", + InstanceId.of(dbId.getInstanceId().getProject(), instanceId))); + } + private static int countOccurrences(String input, String search) { return input.split(search).length - 1; } diff --git a/versions.txt b/versions.txt index 6fbbc5e2230..cdd70c7a2ef 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.81.1:6.81.1 -proto-google-cloud-spanner-v1:6.81.1:6.81.1 -proto-google-cloud-spanner-admin-database-v1:6.81.1:6.81.1 -grpc-google-cloud-spanner-v1:6.81.1:6.81.1 -grpc-google-cloud-spanner-admin-instance-v1:6.81.1:6.81.1 -grpc-google-cloud-spanner-admin-database-v1:6.81.1:6.81.1 -google-cloud-spanner:6.81.1:6.81.1 -google-cloud-spanner-executor:6.81.1:6.81.1 -proto-google-cloud-spanner-executor-v1:6.81.1:6.81.1 -grpc-google-cloud-spanner-executor-v1:6.81.1:6.81.1 +proto-google-cloud-spanner-admin-instance-v1:6.81.2:6.81.2 +proto-google-cloud-spanner-v1:6.81.2:6.81.2 +proto-google-cloud-spanner-admin-database-v1:6.81.2:6.81.2 +grpc-google-cloud-spanner-v1:6.81.2:6.81.2 +grpc-google-cloud-spanner-admin-instance-v1:6.81.2:6.81.2 +grpc-google-cloud-spanner-admin-database-v1:6.81.2:6.81.2 +google-cloud-spanner:6.81.2:6.81.2 +google-cloud-spanner-executor:6.81.2:6.81.2 +proto-google-cloud-spanner-executor-v1:6.81.2:6.81.2 +grpc-google-cloud-spanner-executor-v1:6.81.2:6.81.2