Skip to content

Commit a9a7017

Browse files
authored
Merge pull request avast#86 from lizhiquan/fix-66
fix: zero attempt should return error when `RetryIf` returns false
2 parents d82cd49 + f2a78f2 commit a9a7017

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

retry.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,15 @@ func Do(retryableFunc RetryableFunc, opts ...Option) error {
9797
// Setting attempts to 0 means we'll retry until we succeed
9898
if config.attempts == 0 {
9999
for err := retryableFunc(); err != nil; err = retryableFunc() {
100-
n++
101-
102100
if !IsRecoverable(err) {
103101
return err
104102
}
105103

104+
if !config.retryIf(err) {
105+
return err
106+
}
107+
108+
n++
106109
config.onRetry(n, err)
107110
select {
108111
case <-config.timer.After(delay(config, n, err)):

retry_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,29 @@ func TestRetryIf(t *testing.T) {
7272
assert.Len(t, err, 3)
7373
assert.Equal(t, expectedErrorFormat, err.Error(), "retry error format")
7474
assert.Equal(t, uint(2), retryCount, "right count of retry")
75+
}
76+
77+
func TestRetryIf_ZeroAttempts(t *testing.T) {
78+
var retryCount uint
79+
err := Do(
80+
func() error {
81+
if retryCount >= 2 {
82+
return errors.New("special")
83+
} else {
84+
return errors.New("test")
85+
}
86+
},
87+
OnRetry(func(n uint, err error) { retryCount++ }),
88+
RetryIf(func(err error) bool {
89+
return err.Error() != "special"
90+
}),
91+
Delay(time.Nanosecond),
92+
Attempts(0),
93+
)
94+
assert.Error(t, err)
7595

96+
assert.Equal(t, "special", err.Error(), "retry error format")
97+
assert.Equal(t, uint(2), retryCount, "right count of retry")
7698
}
7799

78100
func TestZeroAttemptsWithError(t *testing.T) {

0 commit comments

Comments
 (0)