Merge pull request #2312 from jakub-m/fix-retry-on-url-errors

Retry on timeout or temporary errors
This commit is contained in:
Taylor Blau 2017-06-14 09:37:43 -06:00 committed by GitHub
commit 37bca6cc58
2 changed files with 50 additions and 0 deletions

@ -2,6 +2,7 @@ package errors
import (
"fmt"
"net/url"
"github.com/pkg/errors"
)
@ -134,6 +135,9 @@ func IsRetriableError(err error) bool {
}); ok {
return e.RetriableError()
}
if cause, ok := Cause(err).(*url.Error); ok {
return cause.Temporary() || cause.Timeout()
}
if parent := parentOf(err); parent != nil {
return IsRetriableError(parent)
}

46
errors/types_test.go Normal file

@ -0,0 +1,46 @@
package errors_test
import (
"net/url"
"testing"
"github.com/git-lfs/git-lfs/errors"
"github.com/stretchr/testify/assert"
)
type TemporaryError struct {
}
func (e TemporaryError) Error() string {
return ""
}
func (e TemporaryError) Temporary() bool {
return true
}
type TimeoutError struct {
}
func (e TimeoutError) Error() string {
return ""
}
func (e TimeoutError) Timeout() bool {
return true
}
func TestCanRetryOnTemporaryError(t *testing.T) {
err := &url.Error{Err: TemporaryError{}}
assert.True(t, errors.IsRetriableError(err))
}
func TestCanRetryOnTimeoutError(t *testing.T) {
err := &url.Error{Err: TimeoutError{}}
assert.True(t, errors.IsRetriableError(err))
}
func TestCannotRetryOnGenericUrlError(t *testing.T) {
err := &url.Error{Err: errors.New("")}
assert.False(t, errors.IsRetriableError(err))
}