Skip to content
This repository was archived by the owner on Jun 27, 2021. It is now read-only.

Commit 551b19a

Browse files
committed
implement API backoff
1 parent 2b119b8 commit 551b19a

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ GOVERSION := 1.12
1919
PROJECT := github.com/DeviaVir/terraform-provider-gsuite
2020
OWNER := $(notdir $(patsubst %/,%,$(dir $(PROJECT))))
2121
NAME := $(notdir $(PROJECT))
22-
VERSION := 0.1.29
22+
VERSION := 0.1.30
2323
EXTERNAL_TOOLS = \
2424
github.com/golang/dep/cmd/dep
2525

gsuite/utils.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package gsuite
55
import (
66
"fmt"
77
"log"
8+
"math/rand"
89
"strings"
910
"time"
1011

@@ -26,34 +27,46 @@ func handleNotFoundError(err error, d *schema.ResourceData, resource string) err
2627
}
2728

2829
func retry(retryFunc func() error) error {
29-
return retryTime(retryFunc, 1, false, false)
30+
return retryTime(retryFunc, 4, false, false)
3031
}
3132

3233
func retryNotFound(retryFunc func() error) error {
33-
return retryTime(retryFunc, 1, true, false)
34+
return retryTime(retryFunc, 4, true, false)
3435
}
3536

3637
func retryPassDuplicate(retryFunc func() error) error {
37-
return retryTime(retryFunc, 1, true, true)
38+
return retryTime(retryFunc, 4, true, true)
3839
}
3940

4041
func retryTime(retryFunc func() error, minutes int, retryNotFound bool, retryPassDuplicate bool) error {
42+
wait := 1
4143
return resource.Retry(time.Duration(minutes)*time.Minute, func() *resource.RetryError {
4244
err := retryFunc()
4345
if err == nil {
4446
return nil
4547
}
48+
rand.Seed(time.Now().UnixNano())
49+
randomNumberMiliseconds := rand.Intn(1001)
4650
if retryPassDuplicate {
4751
if gerr, ok := err.(*googleapi.Error); ok && (gerr.Errors[0].Reason == "quotaExceeded" || gerr.Code == 429 || gerr.Code == 500 || gerr.Code == 502 || gerr.Code == 503) {
52+
log.Printf("[DEBUG] Retrying quota/server error code...")
53+
time.Sleep(time.Duration(wait)*time.Second + time.Duration(randomNumberMiliseconds))
54+
wait = wait * 2
4855
return resource.RetryableError(gerr)
4956
}
5057
} else {
5158
if gerr, ok := err.(*googleapi.Error); ok && (gerr.Errors[0].Reason == "quotaExceeded" || gerr.Code == 409 || gerr.Code == 429 || gerr.Code == 500 || gerr.Code == 502 || gerr.Code == 503) {
59+
log.Printf("[DEBUG] Retrying quota/server error code...")
60+
time.Sleep(time.Duration(wait)*time.Second + time.Duration(randomNumberMiliseconds))
61+
wait = wait * 2
5262
return resource.RetryableError(gerr)
5363
}
5464
}
5565
if retryNotFound {
5666
if gerr, ok := err.(*googleapi.Error); ok && (gerr.Code == 404) {
67+
log.Printf("[DEBUG] Retrying for eventual consistency...")
68+
time.Sleep(time.Duration(wait)*time.Second + time.Duration(randomNumberMiliseconds))
69+
wait = wait * 2
5770
return resource.RetryableError(gerr)
5871
}
5972
}

0 commit comments

Comments
 (0)