From f399dd3a932a416ea28ff944f68121f5bb137855 Mon Sep 17 00:00:00 2001 From: megan07 Date: Fri, 8 Oct 2021 10:10:14 -0500 Subject: [PATCH] add retries for eventual consistancy with storage buckets (#5288) --- .../resources/resource_storage_bucket.go | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/resources/resource_storage_bucket.go b/mmv1/third_party/terraform/resources/resource_storage_bucket.go index 348907497e7e..6f11de098889 100644 --- a/mmv1/third_party/terraform/resources/resource_storage_bucket.go +++ b/mmv1/third_party/terraform/resources/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))) }