@@ -42,6 +42,20 @@ func TestRetryInfo(t *testing.T) {
42
42
}
43
43
}
44
44
45
+ func TestRetryInfoResourceExhausted (t * testing.T ) {
46
+ s := status .New (codes .ResourceExhausted , "" )
47
+ s , err := s .WithDetails (& edpb.RetryInfo {
48
+ RetryDelay : durationpb .New (time .Second ),
49
+ })
50
+ if err != nil {
51
+ t .Fatalf ("Error setting retry details: %v" , err )
52
+ }
53
+ gotDelay , ok := ExtractRetryDelay (toSpannerErrorWithCommitInfo (s .Err (), true ))
54
+ if ! ok || ! testEqual (time .Second , gotDelay ) {
55
+ t .Errorf ("<ok, retryDelay> = <%t, %v>, want <true, %v>" , ok , gotDelay , time .Second )
56
+ }
57
+ }
58
+
45
59
func TestRetryInfoInWrappedError (t * testing.T ) {
46
60
s := status .New (codes .Aborted , "" )
47
61
s , err := s .WithDetails (& edpb.RetryInfo {
@@ -58,6 +72,22 @@ func TestRetryInfoInWrappedError(t *testing.T) {
58
72
}
59
73
}
60
74
75
+ func TestRetryInfoInWrappedErrorResourceExhausted (t * testing.T ) {
76
+ s := status .New (codes .ResourceExhausted , "" )
77
+ s , err := s .WithDetails (& edpb.RetryInfo {
78
+ RetryDelay : durationpb .New (time .Second ),
79
+ })
80
+ if err != nil {
81
+ t .Fatalf ("Error setting retry details: %v" , err )
82
+ }
83
+ gotDelay , ok := ExtractRetryDelay (
84
+ & wrappedTestError {wrapped : toSpannerErrorWithCommitInfo (s .Err (), true ), msg : "Error that is wrapping a Spanner error" },
85
+ )
86
+ if ! ok || ! testEqual (time .Second , gotDelay ) {
87
+ t .Errorf ("<ok, retryDelay> = <%t, %v>, want <true, %v>" , ok , gotDelay , time .Second )
88
+ }
89
+ }
90
+
61
91
func TestRetryInfoTransactionOutcomeUnknownError (t * testing.T ) {
62
92
err := toSpannerErrorWithCommitInfo (context .DeadlineExceeded , true )
63
93
if gotDelay , ok := ExtractRetryDelay (err ); ok {
@@ -89,3 +119,24 @@ func TestRetryerRespectsServerDelay(t *testing.T) {
89
119
t .Fatalf ("Retry delay mismatch:\n got: %v\n want: %v" , maxSeenDelay , serverDelay )
90
120
}
91
121
}
122
+
123
+ func TestRetryerRespectsServerDelayResourceExhausted (t * testing.T ) {
124
+ t .Parallel ()
125
+ serverDelay := 50 * time .Millisecond
126
+ s := status .New (codes .ResourceExhausted , "transaction was aborted" )
127
+ s , err := s .WithDetails (& edpb.RetryInfo {
128
+ RetryDelay : durationpb .New (serverDelay ),
129
+ })
130
+ if err != nil {
131
+ t .Fatalf ("Error setting retry details: %v" , err )
132
+ }
133
+ retryer := onCodes (gax.Backoff {}, codes .ResourceExhausted )
134
+ err = toSpannerErrorWithCommitInfo (s .Err (), true )
135
+ maxSeenDelay , shouldRetry := retryer .Retry (err )
136
+ if ! shouldRetry {
137
+ t .Fatalf ("expected shouldRetry to be true" )
138
+ }
139
+ if maxSeenDelay != serverDelay {
140
+ t .Fatalf ("Retry delay mismatch:\n got: %v\n want: %v" , maxSeenDelay , serverDelay )
141
+ }
142
+ }
0 commit comments