Skip to content

Commit 6418fee

Browse files
Retry internal errors from cloud SQL. (#3469) (#2045)
Signed-off-by: Modular Magician <[email protected]>
1 parent afa7df8 commit 6418fee

File tree

4 files changed

+38
-17
lines changed

4 files changed

+38
-17
lines changed

.changelog/3469.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
Fix occasional failure to delete `google_sql_database_instance` and `google_sql_user`.
3+
```

google-beta/error_retry_predicates.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"google.golang.org/api/googleapi"
12+
sqladmin "google.golang.org/api/sqladmin/v1beta4"
1213
)
1314

1415
type RetryErrorPredicateFunc func(error) (bool, string)
@@ -160,6 +161,22 @@ func pubsubTopicProjectNotReady(err error) (bool, string) {
160161
return false, ""
161162
}
162163

164+
// Retry if Cloud SQL operation returns a 429 with a specific message for
165+
// concurrent operations.
166+
func isSqlInternalError(err error) (bool, string) {
167+
if gerr, ok := err.(*SqlAdminOperationError); ok {
168+
// SqlAdminOperationError is a non-interface type so we need to cast it through
169+
// a layer of interface{}. :)
170+
var ierr interface{}
171+
ierr = gerr
172+
if serr, ok := ierr.(*sqladmin.OperationErrors); ok && serr.Errors[0].Code == "INTERNAL_ERROR" {
173+
return true, "Received an internal error, which is sometimes retryable for some SQL resources. Optimistically retrying."
174+
}
175+
176+
}
177+
return false, ""
178+
}
179+
163180
// Retry if Cloud SQL operation returns a 429 with a specific message for
164181
// concurrent operations.
165182
func isSqlOperationInProgressError(err error) (bool, string) {

google-beta/resource_sql_database_instance.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -927,17 +927,18 @@ func resourceSqlDatabaseInstanceDelete(d *schema.ResourceData, meta interface{})
927927
var op *sqladmin.Operation
928928
err = retryTimeDuration(func() (rerr error) {
929929
op, rerr = config.clientSqlAdmin.Instances.Delete(project, d.Get("name").(string)).Do()
930-
return rerr
931-
}, d.Timeout(schema.TimeoutDelete))
930+
if rerr != nil {
931+
return rerr
932+
}
933+
err = sqlAdminOperationWaitTime(config, op, project, "Delete Instance", d.Timeout(schema.TimeoutDelete))
934+
if err != nil {
935+
return err
936+
}
937+
return nil
938+
}, d.Timeout(schema.TimeoutDelete), isSqlOperationInProgressError, isSqlInternalError)
932939
if err != nil {
933940
return fmt.Errorf("Error, failed to delete instance %s: %s", d.Get("name").(string), err)
934941
}
935-
936-
err = sqlAdminOperationWaitTime(config, op, project, "Delete Instance", d.Timeout(schema.TimeoutDelete))
937-
if err != nil {
938-
return err
939-
}
940-
941942
return nil
942943
}
943944

google-beta/resource_sql_user.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -227,22 +227,22 @@ func resourceSqlUserDelete(d *schema.ResourceData, meta interface{}) error {
227227
var op *sqladmin.Operation
228228
err = retryTimeDuration(func() error {
229229
op, err = config.clientSqlAdmin.Users.Delete(project, instance).Host(host).Name(name).Do()
230-
return err
231-
}, d.Timeout(schema.TimeoutDelete))
230+
if err != nil {
231+
return err
232+
}
233+
234+
if err := sqlAdminOperationWaitTime(config, op, project, "Delete User", d.Timeout(schema.TimeoutDelete)); err != nil {
235+
return err
236+
}
237+
return nil
238+
}, d.Timeout(schema.TimeoutDelete), isSqlOperationInProgressError, isSqlInternalError)
232239

233240
if err != nil {
234241
return fmt.Errorf("Error, failed to delete"+
235242
"user %s in instance %s: %s", name,
236243
instance, err)
237244
}
238245

239-
err = sqlAdminOperationWaitTime(config, op, project, "Delete User", d.Timeout(schema.TimeoutDelete))
240-
241-
if err != nil {
242-
return fmt.Errorf("Error, failure waiting for deletion of %s "+
243-
"in %s: %s", name, instance, err)
244-
}
245-
246246
return nil
247247
}
248248

0 commit comments

Comments
 (0)