Skip to content

Commit 0f4cff7

Browse files
authored
Mark deadline exceeded errors as recoverable errors. (#180)
1 parent bc6fced commit 0f4cff7

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

stackdriver/client.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ func (c *Client) getConnection(ctx context.Context) (*grpc.ClientConn, error) {
130130
}
131131
conn, err := grpc.DialContext(ctx, address, dopts...)
132132
c.conn = conn
133+
if err == context.DeadlineExceeded {
134+
return conn, recoverableError{err}
135+
}
133136
return conn, err
134137
}
135138

@@ -176,9 +179,10 @@ func (c *Client) Store(req *monitoring.CreateTimeSeriesRequest) error {
176179
errors <- err
177180
return
178181
}
179-
if status.Code() == codes.Unavailable {
182+
switch status.Code() {
183+
case codes.DeadlineExceeded, codes.Unavailable:
180184
errors <- recoverableError{err}
181-
} else {
185+
default:
182186
errors <- err
183187
}
184188
}

stackdriver/client_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,32 @@ func newLocalListener() net.Listener {
4343
return l
4444
}
4545

46+
func TestStoreErrorHandlingOnTimeout(t *testing.T) {
47+
listener := newLocalListener()
48+
grpcServer := grpc.NewServer()
49+
monitoring.RegisterMetricServiceServer(grpcServer, &metricServiceServer{nil})
50+
go grpcServer.Serve(listener)
51+
defer grpcServer.Stop()
52+
53+
serverURL, err := url.Parse("https://" + listener.Addr().String() + "?auth=false")
54+
if err != nil {
55+
t.Fatal(err)
56+
}
57+
58+
c := NewClient(&ClientConfig{
59+
URL: serverURL,
60+
Timeout: 0, // Immeditate Timeout.
61+
})
62+
err = c.Store(&monitoring.CreateTimeSeriesRequest{
63+
TimeSeries: []*monitoring.TimeSeries{
64+
&monitoring.TimeSeries{},
65+
},
66+
})
67+
if _, recoverable := err.(recoverableError); !recoverable {
68+
t.Errorf("expected recoverableError in error %v", err)
69+
}
70+
}
71+
4672
func TestStoreErrorHandling(t *testing.T) {
4773
tests := []struct {
4874
status *status.Status
@@ -59,6 +85,10 @@ func TestStoreErrorHandling(t *testing.T) {
5985
status: status.New(codes.Unavailable, longErrMessage),
6086
recoverable: true,
6187
},
88+
{
89+
status: status.New(codes.DeadlineExceeded, longErrMessage),
90+
recoverable: true,
91+
},
6292
}
6393

6494
for i, test := range tests {

0 commit comments

Comments
 (0)