Skip to content

Commit 91d03e3

Browse files
authored
test(spanner): verify that RESOURCE_EXHAUSTED is retried (#11450)
1 parent 280cec1 commit 91d03e3

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

spanner/client_test.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import (
4444
"golang.org/x/sync/errgroup"
4545
"google.golang.org/api/iterator"
4646
"google.golang.org/api/option"
47+
"google.golang.org/genproto/googleapis/rpc/errdetails"
4748
"google.golang.org/grpc/codes"
4849
"google.golang.org/grpc/encoding/gzip"
4950
"google.golang.org/grpc/metadata"
@@ -659,12 +660,29 @@ func TestClient_Single(t *testing.T) {
659660

660661
func TestClient_Single_Unavailable(t *testing.T) {
661662
t.Parallel()
662-
err := testSingleQuery(t, status.Error(codes.Unavailable, "Temporary unavailable"))
663+
err := testSingleQuery(t, serverErrorWithMinimalRetryDelay(codes.Unavailable, "Temporary unavailable"))
663664
if err != nil {
664665
t.Fatal(err)
665666
}
666667
}
667668

669+
func TestClient_Single_ResourceExhausted(t *testing.T) {
670+
t.Parallel()
671+
err := testSingleQuery(t, serverErrorWithMinimalRetryDelay(codes.ResourceExhausted, "Temporary server overload"))
672+
if err != nil {
673+
t.Fatal(err)
674+
}
675+
}
676+
677+
func serverErrorWithMinimalRetryDelay(code codes.Code, msg string) error {
678+
st := status.New(code, msg)
679+
retry := &errdetails.RetryInfo{
680+
RetryDelay: durationpb.New(time.Nanosecond),
681+
}
682+
st, _ = st.WithDetails(retry)
683+
return st.Err()
684+
}
685+
668686
func TestClient_Single_InvalidArgument(t *testing.T) {
669687
t.Parallel()
670688
err := testSingleQuery(t, status.Error(codes.InvalidArgument, "Invalid argument"))
@@ -1174,8 +1192,18 @@ func checkReqsForTransactionOptions(t *testing.T, server InMemSpannerServer, txo
11741192

11751193
func testSingleQuery(t *testing.T, serverError error) error {
11761194
ctx := context.Background()
1177-
server, client, teardown := setupMockedTestServer(t)
1195+
server, client, teardown := setupMockedTestServerWithConfig(t, ClientConfig{SessionPoolConfig: SessionPoolConfig{MinOpened: 1}})
11781196
defer teardown()
1197+
// Wait until all sessions have been created, so we know that those requests will not interfere with the test.
1198+
sp := client.idleSessions
1199+
waitFor(t, func() error {
1200+
sp.mu.Lock()
1201+
defer sp.mu.Unlock()
1202+
if uint64(sp.idleList.Len()) != sp.MinOpened {
1203+
return fmt.Errorf("num open sessions mismatch.\nGot: %d\nWant: %d", sp.numOpened, sp.MinOpened)
1204+
}
1205+
return nil
1206+
})
11791207

11801208
if serverError != nil {
11811209
server.TestSpanner.SetError(serverError)

0 commit comments

Comments
 (0)