Skip to content

Commit c69eaa6

Browse files
authored
Add new retry wrapper fn, retry sql database instance operations that commonly 503 (hashicorp#417)
* Retry sql database instance operations that commonly 503 * use new retry wrapper fn in resource_storage_bucket.go
1 parent 64c140c commit c69eaa6

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

google/resource_sql_database_instance.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -625,20 +625,26 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{})
625625
// If a default root user was created with a wildcard ('%') hostname, delete it. Note that if the resource is a
626626
// replica, then any users are inherited from the master instance and should be left alone.
627627
if !sqlResourceIsReplica(d) {
628-
users, err := config.clientSqlAdmin.Users.List(project, instance.Name).Do()
628+
var users *sqladmin.UsersListResponse
629+
err = retry(func() error {
630+
users, err = config.clientSqlAdmin.Users.List(project, instance.Name).Do()
631+
return err
632+
})
629633
if err != nil {
630634
return fmt.Errorf("Error, attempting to list users associated with instance %s: %s", instance.Name, err)
631635
}
632636
for _, u := range users.Items {
633637
if u.Name == "root" && u.Host == "%" {
634-
op, err = config.clientSqlAdmin.Users.Delete(project, instance.Name, u.Host, u.Name).Do()
638+
err = retry(func() error {
639+
op, err = config.clientSqlAdmin.Users.Delete(project, instance.Name, u.Host, u.Name).Do()
640+
if err == nil {
641+
err = sqladminOperationWait(config, op, project, "Delete default root User")
642+
}
643+
return err
644+
})
635645
if err != nil {
636646
return fmt.Errorf("Error, failed to delete default 'root'@'*' user, but the database was created successfully: %s", err)
637647
}
638-
err = sqladminOperationWait(config, op, project, "Delete default root User")
639-
if err != nil {
640-
return err
641-
}
642648
}
643649
}
644650
}

google/resource_storage_bucket.go

+2-8
Original file line numberDiff line numberDiff line change
@@ -263,15 +263,9 @@ func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error
263263

264264
var res *storage.Bucket
265265

266-
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
266+
err = retry(func() error {
267267
res, err = config.clientStorage.Buckets.Insert(project, sb).Do()
268-
if err == nil {
269-
return nil
270-
}
271-
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 429 {
272-
return resource.RetryableError(gerr)
273-
}
274-
return resource.NonRetryableError(err)
268+
return err
275269
})
276270

277271
if err != nil {

google/utils.go

+15
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import (
77
"log"
88
"regexp"
99
"strings"
10+
"time"
1011

1112
"github.com/hashicorp/errwrap"
13+
"github.com/hashicorp/terraform/helper/resource"
1214
"github.com/hashicorp/terraform/helper/schema"
1315
"github.com/hashicorp/terraform/terraform"
1416
computeBeta "google.golang.org/api/compute/v0.beta"
@@ -331,3 +333,16 @@ func convertArrToMap(ifaceArr []interface{}) map[string]struct{} {
331333
}
332334
return sm
333335
}
336+
337+
func retry(retryFunc func() error) error {
338+
return resource.Retry(1*time.Minute, func() *resource.RetryError {
339+
err := retryFunc()
340+
if err == nil {
341+
return nil
342+
}
343+
if gerr, ok := err.(*googleapi.Error); ok && (gerr.Code == 429 || gerr.Code == 500 || gerr.Code == 502 || gerr.Code == 503) {
344+
return resource.RetryableError(gerr)
345+
}
346+
return resource.NonRetryableError(err)
347+
})
348+
}

0 commit comments

Comments
 (0)