Skip to content

Commit c387c58

Browse files
authored
Merge pull request #469 from rusq/i468
Fix for Unexpected EOF (retry it)
2 parents a1a54a9 + 31682a9 commit c387c58

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

internal/network/network.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func WithRetry(ctx context.Context, lim *rate.Limiter, maxAttempts int, fn func(
128128
ne *net.OpError // read tcp error: see #234
129129
)
130130
switch {
131-
case errors.Is(cbErr, io.EOF):
131+
case errors.Is(cbErr, io.EOF) || errors.Is(cbErr, io.ErrUnexpectedEOF):
132132
// EOF is a transient error
133133
delay := wait(attempt)
134134
slog.WarnContext(ctx, "got EOF, sleeping", "error", cbErr, "delay", delay.String())

internal/network/network_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,24 @@ func TestWithRetry(t *testing.T) {
296296
assert.NoError(t, err)
297297
assert.Equal(t, 2, retries)
298298
})
299+
t.Run("Unexpected EOF error", func(t *testing.T) {
300+
setWaitFunc(func(attempt int) time.Duration { return 50 * time.Millisecond })
301+
t.Cleanup(func() { setWaitFunc(cubicWait) })
302+
303+
reterr := []error{io.ErrUnexpectedEOF, io.ErrUnexpectedEOF, nil}
304+
var retries int
305+
306+
ctx := context.Background()
307+
err := WithRetry(ctx, rate.NewLimiter(1, 1), 3, func(ctx context.Context) error {
308+
err := reterr[retries]
309+
if err != nil {
310+
retries++
311+
}
312+
return err
313+
})
314+
assert.NoError(t, err)
315+
assert.Equal(t, 2, retries)
316+
})
299317
t.Run("meaningful error message", func(t *testing.T) {
300318
setWaitFunc(func(attempt int) time.Duration { return 50 * time.Millisecond })
301319
t.Cleanup(func() { setWaitFunc(cubicWait) })

0 commit comments

Comments
 (0)