diff --git a/go/vt/mysqlctl/s3backupstorage/retryer.go b/go/vt/mysqlctl/s3backupstorage/retryer.go index 18aaa4ed09a..052b1ef26d1 100644 --- a/go/vt/mysqlctl/s3backupstorage/retryer.go +++ b/go/vt/mysqlctl/s3backupstorage/retryer.go @@ -35,7 +35,9 @@ func (retryer *ClosedConnectionRetryer) ShouldRetry(r *request.Request) bool { if r.Error != nil { if awsErr, ok := r.Error.(awserr.Error); ok { - return strings.Contains(awsErr.Error(), "use of closed network connection") + if strings.Contains(awsErr.Error(), "use of closed network connection") { + return true + } } } diff --git a/go/vt/mysqlctl/s3backupstorage/retryer_test.go b/go/vt/mysqlctl/s3backupstorage/retryer_test.go index 35f83221170..9fe3004e6ff 100644 --- a/go/vt/mysqlctl/s3backupstorage/retryer_test.go +++ b/go/vt/mysqlctl/s3backupstorage/retryer_test.go @@ -11,17 +11,18 @@ import ( "github.com/stretchr/testify/assert" ) -type testRetryer struct{} +type testRetryer struct{ retry bool } func (r *testRetryer) MaxRetries() int { return 5 } func (r *testRetryer) RetryRules(req *request.Request) time.Duration { return time.Second } -func (r *testRetryer) ShouldRetry(req *request.Request) bool { return false } +func (r *testRetryer) ShouldRetry(req *request.Request) bool { return r.retry } func TestShouldRetry(t *testing.T) { tests := []struct { - name string - r *request.Request - expected bool + name string + r *request.Request + fallbackPolicy bool + expected bool }{ { @@ -29,14 +30,16 @@ func TestShouldRetry(t *testing.T) { r: &request.Request{ Retryable: aws.Bool(false), }, - expected: false, + fallbackPolicy: false, + expected: false, }, { name: "retryable request", r: &request.Request{ Retryable: aws.Bool(true), }, - expected: true, + fallbackPolicy: false, + expected: true, }, { name: "non aws error", @@ -44,7 +47,8 @@ func TestShouldRetry(t *testing.T) { Retryable: nil, Error: errors.New("some error"), }, - expected: false, + fallbackPolicy: false, + expected: false, }, { name: "closed connection error", @@ -52,7 +56,8 @@ func TestShouldRetry(t *testing.T) { Retryable: nil, Error: awserr.New("5xx", "use of closed network connection", nil), }, - expected: true, + fallbackPolicy: false, + expected: true, }, { name: "closed connection error (non nil origError)", @@ -60,13 +65,23 @@ func TestShouldRetry(t *testing.T) { Retryable: nil, Error: awserr.New("5xx", "use of closed network connection", errors.New("some error")), }, - expected: true, + fallbackPolicy: false, + expected: true, + }, + { + name: "other aws error hits fallback policy", + r: &request.Request{ + Retryable: nil, + Error: awserr.New("code", "not a closed network connectionn", errors.New("some error")), + }, + fallbackPolicy: true, + expected: true, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - retryer := &ClosedConnectionRetryer{&testRetryer{}} + retryer := &ClosedConnectionRetryer{&testRetryer{test.fallbackPolicy}} msg := "" if test.r.Error != nil { if awsErr, ok := test.r.Error.(awserr.Error); ok {