Merge pull request #2312 from jakub-m/fix-retry-on-url-errors
Retry on timeout or temporary errors
This commit is contained in:
commit
37bca6cc58
@ -2,6 +2,7 @@ package errors
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
@ -134,6 +135,9 @@ func IsRetriableError(err error) bool {
|
|||||||
}); ok {
|
}); ok {
|
||||||
return e.RetriableError()
|
return e.RetriableError()
|
||||||
}
|
}
|
||||||
|
if cause, ok := Cause(err).(*url.Error); ok {
|
||||||
|
return cause.Temporary() || cause.Timeout()
|
||||||
|
}
|
||||||
if parent := parentOf(err); parent != nil {
|
if parent := parentOf(err); parent != nil {
|
||||||
return IsRetriableError(parent)
|
return IsRetriableError(parent)
|
||||||
}
|
}
|
||||||
|
46
errors/types_test.go
Normal file
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))
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user