From 37c8f804fc97c9e56162f5258cf84afe71cc3e22 Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Tue, 4 Oct 2022 21:40:01 +0000 Subject: [PATCH] Bigtable: Retry GC policy operations with a longer poll interval (#6627) Co-authored-by: Riley Karson Signed-off-by: Modular Magician --- .changelog/6627.txt | 3 +++ google/resource_bigtable_gc_policy.go | 23 +++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 .changelog/6627.txt diff --git a/.changelog/6627.txt b/.changelog/6627.txt new file mode 100644 index 00000000000..c7bf4630ad1 --- /dev/null +++ b/.changelog/6627.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +bigtable: retry GC policy operations with a longer poll interval +``` diff --git a/google/resource_bigtable_gc_policy.go b/google/resource_bigtable_gc_policy.go index df3151e5667..b511236301d 100644 --- a/google/resource_bigtable_gc_policy.go +++ b/google/resource_bigtable_gc_policy.go @@ -202,10 +202,17 @@ func resourceBigtableGCPolicyUpsert(d *schema.ResourceData, meta interface{}) er tableName := d.Get("table").(string) columnFamily := d.Get("column_family").(string) - err = retryTimeDuration(func() error { + retryFunc := func() (interface{}, error) { reqErr := c.SetGCPolicy(ctx, tableName, columnFamily, gcPolicy) - return reqErr - }, d.Timeout(schema.TimeoutCreate), isBigTableRetryableError) + return "", reqErr + } + // The default create timeout is 20 minutes. + timeout := d.Timeout(schema.TimeoutCreate) + pollInterval := time.Duration(30) * time.Second + // Mutations to gc policies can only happen one-at-a-time and take some amount of time. + // Use a fixed polling rate of 30s based on the RetryInfo returned by the server rather than + // the standard up-to-10s exponential backoff for those operations. + _, err = retryWithPolling(retryFunc, timeout, pollInterval, isBigTableRetryableError) if err != nil { return err } @@ -376,10 +383,14 @@ func resourceBigtableGCPolicyDestroy(d *schema.ResourceData, meta interface{}) e defer c.Close() - err = retryTimeDuration(func() error { + retryFunc := func() (interface{}, error) { reqErr := c.SetGCPolicy(ctx, d.Get("table").(string), d.Get("column_family").(string), bigtable.NoGcPolicy()) - return reqErr - }, d.Timeout(schema.TimeoutDelete), isBigTableRetryableError) + return "", reqErr + } + // The default delete timeout is 20 minutes. + timeout := d.Timeout(schema.TimeoutDelete) + pollInterval := time.Duration(30) * time.Second + _, err = retryWithPolling(retryFunc, timeout, pollInterval, isBigTableRetryableError) if err != nil { return err }