Skip to content

Commit 29b52dc

Browse files
Vizerairahul2393
andauthored
feat(spanner): Add RESOURCE_EXHAUSTED to retryable transaction codes (#10412)
* feat: Add "RESOURCE_EXHAUSTED" to list of retryable codes for streaming operations. * feat: Add RESOURCE_EXHAUSTED as a retryable code for transactions. * feat: Add RESOURCE_EXHAUSTED to retryable transaction codes Update formatting * feat: Add RESOURCE_EXHAUSTED to retryable transaction codes Update formatting * feat(spanner): Add RESOURCE_EXHAUSTED to retryable transaction codes update formatting * Update retry_test.go --------- Co-authored-by: rahul2393 <[email protected]>
1 parent a880fb8 commit 29b52dc

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

spanner/retry.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (r *spannerRetryer) Retry(err error) (time.Duration, bool) {
8585
// a minimum of 10ms and maximum of 32s. There is no delay before the retry if
8686
// the error was Session not found or failed inline begin transaction.
8787
func runWithRetryOnAbortedOrFailedInlineBeginOrSessionNotFound(ctx context.Context, f func(context.Context) error) error {
88-
retryer := onCodes(DefaultRetryBackoff, codes.Aborted, codes.Internal)
88+
retryer := onCodes(DefaultRetryBackoff, codes.Aborted, codes.ResourceExhausted, codes.Internal)
8989
funcWithRetry := func(ctx context.Context) error {
9090
for {
9191
err := f(ctx)

spanner/retry_test.go

+51
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,20 @@ func TestRetryInfo(t *testing.T) {
4242
}
4343
}
4444

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+
4559
func TestRetryInfoInWrappedError(t *testing.T) {
4660
s := status.New(codes.Aborted, "")
4761
s, err := s.WithDetails(&edpb.RetryInfo{
@@ -58,6 +72,22 @@ func TestRetryInfoInWrappedError(t *testing.T) {
5872
}
5973
}
6074

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+
6191
func TestRetryInfoTransactionOutcomeUnknownError(t *testing.T) {
6292
err := toSpannerErrorWithCommitInfo(context.DeadlineExceeded, true)
6393
if gotDelay, ok := ExtractRetryDelay(err); ok {
@@ -89,3 +119,24 @@ func TestRetryerRespectsServerDelay(t *testing.T) {
89119
t.Fatalf("Retry delay mismatch:\ngot: %v\nwant: %v", maxSeenDelay, serverDelay)
90120
}
91121
}
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:\ngot: %v\nwant: %v", maxSeenDelay, serverDelay)
141+
}
142+
}

0 commit comments

Comments
 (0)