aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'internal/testsuite')
-rw-r--r--internal/testsuite/testsuite.go26
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)