Skip to content

Commit 370b1f8

Browse files
authored
Merge pull request #1 from avast/log_of_err
retry return error with log of all errors
2 parents 8ea1249 + 73ec637 commit 370b1f8

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

retry.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package retry
44

55
import (
66
"fmt"
7+
"strings"
78
"time"
89
)
910

@@ -49,11 +50,14 @@ func RetryWithOpts(retryableFunction Retryable, opts RetryOpts) error {
4950
func RetryCustom(retryableFunction Retryable, onRetryFunction OnRetry, opts RetryOpts) error {
5051
var n uint
5152

53+
errorLog := make(errorLog, opts.tries)
54+
5255
for n < opts.tries {
5356
err := retryableFunction()
5457

5558
if err != nil {
5659
onRetryFunction(n, err)
60+
errorLog[n] = err
5761

5862
delayTime := opts.delay * (1 << (n - 1))
5963
time.Sleep((time.Duration)(delayTime) * opts.units)
@@ -64,5 +68,16 @@ func RetryCustom(retryableFunction Retryable, onRetryFunction OnRetry, opts Retr
6468
n++
6569
}
6670

67-
return fmt.Errorf("All (%d) retries fail", opts.tries)
71+
return fmt.Errorf("All (%d) retries fail:\n%s", opts.tries, errorLog)
72+
}
73+
74+
type errorLog []error
75+
76+
func (log errorLog) String() string {
77+
logWithNumber := make([]string, len(log))
78+
for i, l := range log {
79+
logWithNumber[i] = fmt.Sprintf("#%d: %s", i+1, l.Error())
80+
}
81+
82+
return strings.Join(logWithNumber, "\n")
6883
}

retry_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,19 @@ func TestCustom(t *testing.T) {
1515
NewRetryOpts().Units(time.Nanosecond),
1616
)
1717
assert.Error(t, err)
18+
19+
expectedErrorFormat := `All (10) retries fail:
20+
#1: test
21+
#2: test
22+
#3: test
23+
#4: test
24+
#5: test
25+
#6: test
26+
#7: test
27+
#8: test
28+
#9: test
29+
#10: test`
30+
assert.Equal(t, expectedErrorFormat, err.Error(), "retry error format")
1831
assert.Equal(t, uint(45), retrySum, "right count of retry")
1932

2033
retrySum = 0

0 commit comments

Comments
 (0)