diff options
Diffstat (limited to 'internal/testsuite')
| -rw-r--r-- | internal/testsuite/testsuite.go | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/internal/testsuite/testsuite.go b/internal/testsuite/testsuite.go index 6e48eca1..a1e39720 100644 --- a/internal/testsuite/testsuite.go +++ b/internal/testsuite/testsuite.go @@ -28,6 +28,32 @@ func ReceiveSignals() { log.Fatalf("terminating on signal %s", <-s) } +// RetryExp retries f if the resulting error is equivalent to e according to +// [errors.Is], up to 8 times. +func RetryExp[T any](f func() (T, error), e error) (v T, err error) { + const statRetry = 8 // 64 ms + var n int + d := 256 * time.Microsecond + +retry: + v, err = f() + if err != nil { + if !errors.Is(err, e) { + return + } + + n++ + if n == statRetry { + return + } + + time.Sleep(d) + d *= 2 + goto retry + } + return +} + var ( // users caches [user.LookupId] calls. users = make(map[string]*user.User) |
