From 11029206254ad98de7d64dcccc51de0b323fe8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hengfeng=20Li=E2=80=AC?= Date: Thu, 18 Dec 2025 23:02:22 +0000 Subject: [PATCH 1/4] fix: adjust the initial polling delay for ddl operations --- .../google/cloud/spanner/SpannerOptions.java | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index a40ee051a9..743f33d601 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -1148,12 +1148,15 @@ private static String createCustomClientLibToken(String token) { protected Builder() { // Manually set retry and polling settings that work. - OperationTimedPollAlgorithm longRunningPollingAlgorithm = + + // The polling setting with a short initial delay as we expect + // it to return soon. + OperationTimedPollAlgorithm shortInitialPollingDelayAlgorithm = OperationTimedPollAlgorithm.create( RetrySettings.newBuilder() .setInitialRpcTimeoutDuration(Duration.ofSeconds(60L)) .setMaxRpcTimeoutDuration(Duration.ofSeconds(600L)) - .setInitialRetryDelayDuration(Duration.ofSeconds(20L)) + .setInitialRetryDelayDuration(Duration.ofSeconds(1L)) .setMaxRetryDelayDuration(Duration.ofSeconds(45L)) .setRetryDelayMultiplier(1.5) .setRpcTimeoutMultiplier(1.5) @@ -1161,13 +1164,30 @@ protected Builder() { .build()); databaseAdminStubSettingsBuilder .createDatabaseOperationSettings() - .setPollingAlgorithm(longRunningPollingAlgorithm); + .setPollingAlgorithm(shortInitialPollingDelayAlgorithm); databaseAdminStubSettingsBuilder + .updateDatabaseDdlOperationSettings() + .setPollingAlgorithm(shortInitialPollingDelayAlgorithm); + + // The polling setting with a long initial delay as we expect + // the operation to take a bit long time to return. + OperationTimedPollAlgorithm longInitialPollingDelayAlgorithm = + OperationTimedPollAlgorithm.create( + RetrySettings.newBuilder() + .setInitialRpcTimeoutDuration(Duration.ofSeconds(60L)) + .setMaxRpcTimeoutDuration(Duration.ofSeconds(600L)) + .setInitialRetryDelayDuration(Duration.ofSeconds(20L)) + .setMaxRetryDelayDuration(Duration.ofSeconds(45L)) + .setRetryDelayMultiplier(1.5) + .setRpcTimeoutMultiplier(1.5) + .setTotalTimeoutDuration(Duration.ofHours(48L)) + .build()); + databaseAdminStubSettingsBuilder .createBackupOperationSettings() - .setPollingAlgorithm(longRunningPollingAlgorithm); + .setPollingAlgorithm(longInitialPollingDelayAlgorithm); databaseAdminStubSettingsBuilder .restoreDatabaseOperationSettings() - .setPollingAlgorithm(longRunningPollingAlgorithm); + .setPollingAlgorithm(longInitialPollingDelayAlgorithm); } Builder(SpannerOptions options) { From 1b78b488ffb7aa67df0b2c8c0bab2072ddf86df0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hengfeng=20Li=E2=80=AC?= Date: Thu, 18 Dec 2025 23:45:05 +0000 Subject: [PATCH 2/4] fix the lint issue --- .../main/java/com/google/cloud/spanner/SpannerOptions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index 743f33d601..e86fb47a6f 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -1168,7 +1168,7 @@ protected Builder() { databaseAdminStubSettingsBuilder .updateDatabaseDdlOperationSettings() .setPollingAlgorithm(shortInitialPollingDelayAlgorithm); - + // The polling setting with a long initial delay as we expect // the operation to take a bit long time to return. OperationTimedPollAlgorithm longInitialPollingDelayAlgorithm = @@ -1182,7 +1182,7 @@ protected Builder() { .setRpcTimeoutMultiplier(1.5) .setTotalTimeoutDuration(Duration.ofHours(48L)) .build()); - databaseAdminStubSettingsBuilder + databaseAdminStubSettingsBuilder .createBackupOperationSettings() .setPollingAlgorithm(longInitialPollingDelayAlgorithm); databaseAdminStubSettingsBuilder From 0b0a2c2745982c06c34fbf4a739ed92d34b82b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hengfeng=20Li=E2=80=AC?= Date: Mon, 5 Jan 2026 00:25:09 +0000 Subject: [PATCH 3/4] refactor the code --- .../google/cloud/spanner/SpannerOptions.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index e86fb47a6f..ec1c747535 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -1148,19 +1148,22 @@ private static String createCustomClientLibToken(String token) { protected Builder() { // Manually set retry and polling settings that work. + RetrySettings baseRetrySettings = + RetrySettings.newBuilder() + .setInitialRpcTimeoutDuration(Duration.ofSeconds(60L)) + .setMaxRpcTimeoutDuration(Duration.ofSeconds(600L)) + .setMaxRetryDelayDuration(Duration.ofSeconds(45L)) + .setRetryDelayMultiplier(1.5) + .setRpcTimeoutMultiplier(1.5) + .setTotalTimeoutDuration(Duration.ofHours(48L)) + .build(); // The polling setting with a short initial delay as we expect // it to return soon. OperationTimedPollAlgorithm shortInitialPollingDelayAlgorithm = OperationTimedPollAlgorithm.create( - RetrySettings.newBuilder() - .setInitialRpcTimeoutDuration(Duration.ofSeconds(60L)) - .setMaxRpcTimeoutDuration(Duration.ofSeconds(600L)) + baseRetrySettings.toBuilder() .setInitialRetryDelayDuration(Duration.ofSeconds(1L)) - .setMaxRetryDelayDuration(Duration.ofSeconds(45L)) - .setRetryDelayMultiplier(1.5) - .setRpcTimeoutMultiplier(1.5) - .setTotalTimeoutDuration(Duration.ofHours(48L)) .build()); databaseAdminStubSettingsBuilder .createDatabaseOperationSettings() @@ -1173,14 +1176,8 @@ protected Builder() { // the operation to take a bit long time to return. OperationTimedPollAlgorithm longInitialPollingDelayAlgorithm = OperationTimedPollAlgorithm.create( - RetrySettings.newBuilder() - .setInitialRpcTimeoutDuration(Duration.ofSeconds(60L)) - .setMaxRpcTimeoutDuration(Duration.ofSeconds(600L)) + baseRetrySettings.toBuilder() .setInitialRetryDelayDuration(Duration.ofSeconds(20L)) - .setMaxRetryDelayDuration(Duration.ofSeconds(45L)) - .setRetryDelayMultiplier(1.5) - .setRpcTimeoutMultiplier(1.5) - .setTotalTimeoutDuration(Duration.ofHours(48L)) .build()); databaseAdminStubSettingsBuilder .createBackupOperationSettings() From f13ea8559d89409d1dc98675f323f7840cfd3f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hengfeng=20Li=E2=80=AC?= Date: Tue, 6 Jan 2026 22:08:26 +0000 Subject: [PATCH 4/4] create a separate setting for updateDatabaseDdl --- .../google/cloud/spanner/SpannerOptions.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index ec1c747535..3185a81c32 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -1168,9 +1168,6 @@ protected Builder() { databaseAdminStubSettingsBuilder .createDatabaseOperationSettings() .setPollingAlgorithm(shortInitialPollingDelayAlgorithm); - databaseAdminStubSettingsBuilder - .updateDatabaseDdlOperationSettings() - .setPollingAlgorithm(shortInitialPollingDelayAlgorithm); // The polling setting with a long initial delay as we expect // the operation to take a bit long time to return. @@ -1185,6 +1182,22 @@ protected Builder() { databaseAdminStubSettingsBuilder .restoreDatabaseOperationSettings() .setPollingAlgorithm(longInitialPollingDelayAlgorithm); + + // updateDatabaseDdl requires a separate setting because + // it has no existing overrides on RPC timeouts for LRO polling. + databaseAdminStubSettingsBuilder + .updateDatabaseDdlOperationSettings() + .setPollingAlgorithm( + OperationTimedPollAlgorithm.create( + RetrySettings.newBuilder() + .setInitialRetryDelayDuration(Duration.ofMillis(1000L)) + .setRetryDelayMultiplier(1.5) + .setMaxRetryDelayDuration(Duration.ofMillis(45000L)) + .setInitialRpcTimeoutDuration(Duration.ZERO) + .setRpcTimeoutMultiplier(1.0) + .setMaxRpcTimeoutDuration(Duration.ZERO) + .setTotalTimeoutDuration(Duration.ofHours(48L)) + .build())); } Builder(SpannerOptions options) {