From 6756eb5c7987c3e37fe55071a545ba5281c09445 Mon Sep 17 00:00:00 2001 From: The Magician Date: Tue, 28 Apr 2020 13:46:02 -0400 Subject: [PATCH] Add retry for storage bucket 412 (#3434) (#6235) * add retry for storage bucket 412 * format Signed-off-by: Modular Magician --- .changelog/3434.txt | 3 +++ google/error_retry_predicates.go | 7 +++++++ google/iam_storage_bucket.go | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .changelog/3434.txt diff --git a/.changelog/3434.txt b/.changelog/3434.txt new file mode 100644 index 00000000000..e6980e7d3a3 --- /dev/null +++ b/.changelog/3434.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +storage: Added retries for `google_storage_bucket_iam_*` on 412 (precondition not met) errors for eventually consistent bucket creation. +``` diff --git a/google/error_retry_predicates.go b/google/error_retry_predicates.go index bc39c8fd4ef..d1a4f9b0a40 100644 --- a/google/error_retry_predicates.go +++ b/google/error_retry_predicates.go @@ -215,3 +215,10 @@ func isNotFoundRetryableError(opType string) RetryErrorPredicateFunc { return false, "" } } + +func isStoragePreconditionError(err error) (bool, string) { + if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 412 { + return true, fmt.Sprintf("Retry on storage precondition not met") + } + return false, "" +} diff --git a/google/iam_storage_bucket.go b/google/iam_storage_bucket.go index 2b681e13f90..aa3442f1cdc 100644 --- a/google/iam_storage_bucket.go +++ b/google/iam_storage_bucket.go @@ -102,7 +102,7 @@ func (u *StorageBucketIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager. return nil, err } - policy, err := sendRequest(u.Config, "GET", "", url, obj) + policy, err := sendRequest(u.Config, "GET", "", url, obj, isStoragePreconditionError) if err != nil { return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err) } @@ -129,7 +129,7 @@ func (u *StorageBucketIamUpdater) SetResourceIamPolicy(policy *cloudresourcemana return err } - _, err = sendRequestWithTimeout(u.Config, "PUT", "", url, obj, u.d.Timeout(schema.TimeoutCreate)) + _, err = sendRequestWithTimeout(u.Config, "PUT", "", url, obj, u.d.Timeout(schema.TimeoutCreate), isStoragePreconditionError) if err != nil { return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err) }