Skip to content
This repository has been archived by the owner on Dec 16, 2022. It is now read-only.

Commit

Permalink
Merge pull request vitessio#6395 from tinyspeck/am_fix_retryer
Browse files Browse the repository at this point in the history
Fix segfault in backup retryer
  • Loading branch information
deepthi authored Jun 29, 2020
2 parents 1f54847 + 11d5b09 commit c96a069
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 1 deletion.
2 changes: 1 addition & 1 deletion go/vt/mysqlctl/s3backupstorage/retryer.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func (retryer *ClosedConnectionRetryer) ShouldRetry(r *request.Request) bool {

if r.Error != nil {
if awsErr, ok := r.Error.(awserr.Error); ok {
return strings.Contains(awsErr.OrigErr().Error(), "use of closed network connection")
return strings.Contains(awsErr.Error(), "use of closed network connection")
}
}

Expand Down
79 changes: 79 additions & 0 deletions go/vt/mysqlctl/s3backupstorage/retryer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package s3backupstorage

import (
"errors"
"testing"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/stretchr/testify/assert"
)

type testRetryer struct{}

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 TestShouldRetry(t *testing.T) {
tests := []struct {
name string
r *request.Request
expected bool
}{

{
name: "non retryable request",
r: &request.Request{
Retryable: aws.Bool(false),
},
expected: false,
},
{
name: "retryable request",
r: &request.Request{
Retryable: aws.Bool(true),
},
expected: true,
},
{
name: "non aws error",
r: &request.Request{
Retryable: nil,
Error: errors.New("some error"),
},
expected: false,
},
{
name: "closed connection error",
r: &request.Request{
Retryable: nil,
Error: awserr.New("5xx", "use of closed network connection", nil),
},
expected: true,
},
{
name: "closed connection error (non nil origError)",
r: &request.Request{
Retryable: nil,
Error: awserr.New("5xx", "use of closed network connection", errors.New("some error")),
},
expected: true,
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
retryer := &ClosedConnectionRetryer{&testRetryer{}}
msg := ""
if test.r.Error != nil {
if awsErr, ok := test.r.Error.(awserr.Error); ok {
msg = awsErr.Error()
}
}
assert.Equal(t, test.expected, retryer.ShouldRetry(test.r), msg)
})
}
}

0 comments on commit c96a069

Please sign in to comment.