From c6055da104c04cfb699f64b52cd6bd2024536713 Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Fri, 8 Oct 2021 15:20:14 +0000 Subject: [PATCH] add retries for eventual consistancy with storage buckets (#5288) Signed-off-by: Modular Magician --- .changelog/5288.txt | 3 ++ ...esource_gke_hub_feature_membership_test.go | 2 +- google-beta/resource_storage_bucket.go | 33 ++++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .changelog/5288.txt diff --git a/.changelog/5288.txt b/.changelog/5288.txt new file mode 100644 index 0000000000..4ead1b5e0d --- /dev/null +++ b/.changelog/5288.txt @@ -0,0 +1,3 @@ +```release-note:bug +storage: fixed a bug to better handle eventual consistency among `google_storage_bucket` resources. +``` diff --git a/google-beta/resource_gke_hub_feature_membership_test.go b/google-beta/resource_gke_hub_feature_membership_test.go index 9e1f2ea64d..32fa84c196 100644 --- a/google-beta/resource_gke_hub_feature_membership_test.go +++ b/google-beta/resource_gke_hub_feature_membership_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - "github.com/GoogleCloudPlatform/declarative-resource-client-library/dcl" + dcl "github.com/GoogleCloudPlatform/declarative-resource-client-library/dcl" gkehub "github.com/GoogleCloudPlatform/declarative-resource-client-library/services/google/gkehub/beta" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" diff --git a/google-beta/resource_storage_bucket.go b/google-beta/resource_storage_bucket.go index 348907497e..6f11de0988 100644 --- a/google-beta/resource_storage_bucket.go +++ b/google-beta/resource_storage_bucket.go @@ -466,6 +466,17 @@ func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] Created bucket %v at location %v\n\n", res.Name, res.SelfLink) d.SetId(res.Id) + // There seems to be some eventual consistency errors in some cases, so we want to check a few times + // to make sure it exists before moving on + err = retryTimeDuration(func() (operr error) { + _, retryErr := config.NewStorageClient(userAgent).Buckets.Get(res.Name).Do() + return retryErr + }, d.Timeout(schema.TimeoutCreate), isNotFoundRetryableError("bucket creation")) + + if err != nil { + return fmt.Errorf("Error reading bucket after creation: %s", err) + } + // If the retention policy is not already locked, check if it // needs to be locked. if v, ok := d.GetOk("retention_policy"); ok && !res.RetentionPolicy.IsLocked { @@ -601,6 +612,17 @@ func resourceStorageBucketUpdate(d *schema.ResourceData, meta interface{}) error return fmt.Errorf("Error setting self_link: %s", err) } + // There seems to be some eventual consistency errors in some cases, so we want to check a few times + // to make sure it exists before moving on + err = retryTimeDuration(func() (operr error) { + _, retryErr := config.NewStorageClient(userAgent).Buckets.Get(res.Name).Do() + return retryErr + }, d.Timeout(schema.TimeoutUpdate), isNotFoundRetryableError("bucket update")) + + if err != nil { + return fmt.Errorf("Error reading bucket after update: %s", err) + } + if d.HasChange("retention_policy") { if v, ok := d.GetOk("retention_policy"); ok { retention_policies := v.([]interface{}) @@ -634,7 +656,16 @@ func resourceStorageBucketRead(d *schema.ResourceData, meta interface{}) error { // Get the bucket and acl bucket := d.Get("name").(string) - res, err := config.NewStorageClient(userAgent).Buckets.Get(bucket).Do() + + var res *storage.Bucket + // There seems to be some eventual consistency errors in some cases, so we want to check a few times + // to make sure it exists before moving on + err = retryTimeDuration(func() (operr error) { + var retryErr error + res, retryErr = config.NewStorageClient(userAgent).Buckets.Get(bucket).Do() + return retryErr + }, d.Timeout(schema.TimeoutCreate), isNotFoundRetryableError("bucket creation")) + if err != nil { return handleNotFoundError(err, d, fmt.Sprintf("Storage Bucket %q", d.Get("name").(string))) }