@@ -5,6 +5,7 @@ package gsuite
5
5
import (
6
6
"fmt"
7
7
"log"
8
+ "math/rand"
8
9
"strings"
9
10
"time"
10
11
@@ -26,34 +27,46 @@ func handleNotFoundError(err error, d *schema.ResourceData, resource string) err
26
27
}
27
28
28
29
func retry (retryFunc func () error ) error {
29
- return retryTime (retryFunc , 1 , false , false )
30
+ return retryTime (retryFunc , 4 , false , false )
30
31
}
31
32
32
33
func retryNotFound (retryFunc func () error ) error {
33
- return retryTime (retryFunc , 1 , true , false )
34
+ return retryTime (retryFunc , 4 , true , false )
34
35
}
35
36
36
37
func retryPassDuplicate (retryFunc func () error ) error {
37
- return retryTime (retryFunc , 1 , true , true )
38
+ return retryTime (retryFunc , 4 , true , true )
38
39
}
39
40
40
41
func retryTime (retryFunc func () error , minutes int , retryNotFound bool , retryPassDuplicate bool ) error {
42
+ wait := 1
41
43
return resource .Retry (time .Duration (minutes )* time .Minute , func () * resource.RetryError {
42
44
err := retryFunc ()
43
45
if err == nil {
44
46
return nil
45
47
}
48
+ rand .Seed (time .Now ().UnixNano ())
49
+ randomNumberMiliseconds := rand .Intn (1001 )
46
50
if retryPassDuplicate {
47
51
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
48
55
return resource .RetryableError (gerr )
49
56
}
50
57
} else {
51
58
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
52
62
return resource .RetryableError (gerr )
53
63
}
54
64
}
55
65
if retryNotFound {
56
66
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
57
70
return resource .RetryableError (gerr )
58
71
}
59
72
}
0 commit comments