40 lines
1.0 KiB
Go
40 lines
1.0 KiB
Go
package redis
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/redis/go-redis/v9/internal"
|
|
)
|
|
|
|
// DialRetryBackoffConstant returns a dial retry backoff function that always returns d.
|
|
// attempt is 0-based: attempt=0 is the delay after the 1st failed dial.
|
|
func DialRetryBackoffConstant(d time.Duration) func(attempt int) time.Duration {
|
|
if d < 0 {
|
|
d = 0
|
|
}
|
|
return func(int) time.Duration { return d }
|
|
}
|
|
|
|
// DialRetryBackoffExponential returns a dial retry backoff function that uses exponential
|
|
// backoff with jitter and a cap, using internal.RetryBackoff.
|
|
//
|
|
// attempt is 0-based: attempt=0 is the delay after the 1st failed dial.
|
|
func DialRetryBackoffExponential(minBackoff, maxBackoff time.Duration) func(attempt int) time.Duration {
|
|
if minBackoff < 0 {
|
|
minBackoff = 0
|
|
}
|
|
if maxBackoff < 0 {
|
|
maxBackoff = 0
|
|
}
|
|
if minBackoff > maxBackoff {
|
|
minBackoff = maxBackoff
|
|
}
|
|
return func(attempt int) time.Duration {
|
|
// internal.RetryBackoff expects retry >= 0.
|
|
if attempt < 0 {
|
|
attempt = 0
|
|
}
|
|
return internal.RetryBackoff(attempt, minBackoff, maxBackoff)
|
|
}
|
|
}
|