From 9c2344f72688aa6b4501ae9d42d6832c0d2e087f Mon Sep 17 00:00:00 2001 From: yangfengting Date: Tue, 25 Jan 2022 16:36:34 +0800 Subject: [PATCH] infinite retry should also have delay --- go.sum | 5 ----- retry.go | 22 ++++++++++++++-------- retry_test.go | 5 +++-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/go.sum b/go.sum index 01941e6..1ca3979 100644 --- a/go.sum +++ b/go.sum @@ -4,7 +4,6 @@ github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0 h1:i5VIxp6QB8o github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0/go.mod h1:4xpMLz7RBWyB+ElzHu8Llua96TRCB3YwX+l5EP1wmHk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481 h1:jMxcLa+VjJKhpCwbLUXAD15wJ+hhvXMLujCl3MkXpfM= github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= @@ -23,16 +22,12 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211015200801-69063c4bb744 h1:KzbpndAYEM+4oHRp9JmB2ewj0NHHxO3Z0g7Gus2O1kk= -golang.org/x/sys v0.0.0-20211015200801-69063c4bb744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 h1:G2DDmludOQZoWbpCr7OKDxnl478ZBGMcOhrv+ooX/Q4= golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/retry.go b/retry.go index ead1c02..3ce13dd 100644 --- a/retry.go +++ b/retry.go @@ -75,10 +75,10 @@ type RetryableFunc func() error func Do(retryableFunc RetryableFunc, opts ...Option) error { var n uint - //default + // default config := newDefaultRetryConfig() - //apply opts + // apply opts for _, opt := range opts { opt(config) } @@ -90,6 +90,8 @@ func Do(retryableFunc RetryableFunc, opts ...Option) error { // Setting attempts to 0 means we'll retry until we succeed if config.attempts == 0 { for err := retryableFunc(); err != nil; err = retryableFunc() { + n++ + <-time.After(delay(config, n, err)) } return nil @@ -120,13 +122,8 @@ func Do(retryableFunc RetryableFunc, opts ...Option) error { break } - delayTime := config.delayType(n, err, config) - if config.maxDelay > 0 && delayTime > config.maxDelay { - delayTime = config.maxDelay - } - select { - case <-time.After(delayTime): + case <-time.After(delay(config, n, err)): case <-config.context.Done(): if config.lastErrorOnly { return config.context.Err() @@ -220,3 +217,12 @@ func unpackUnrecoverable(err error) error { return err } + +func delay(config *Config, n uint, err error) time.Duration { + delayTime := config.delayType(n, err, config) + if config.maxDelay > 0 && delayTime > config.maxDelay { + delayTime = config.maxDelay + } + + return delayTime +} diff --git a/retry_test.go b/retry_test.go index 2749465..0506813 100644 --- a/retry_test.go +++ b/retry_test.go @@ -86,6 +86,7 @@ func TestZeroAttemptsWithError(t *testing.T) { return nil }, Attempts(0), + MaxDelay(time.Nanosecond), ) assert.NoError(t, err) @@ -195,8 +196,8 @@ func TestMaxDelay(t *testing.T) { ) dur := time.Since(start) assert.Error(t, err) - assert.True(t, dur > 170*time.Millisecond, "5 times with maximum delay retry is longer than 170ms") - assert.True(t, dur < 200*time.Millisecond, "5 times with maximum delay retry is shorter than 200ms") + assert.True(t, dur > 120*time.Millisecond, "5 times with maximum delay retry is longer than 120ms") + assert.True(t, dur < 205*time.Millisecond, "5 times with maximum delay retry is shorter than 205ms") } func TestBackOffDelay(t *testing.T) {