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