Skip to content

Commit f6de0b8

Browse files
committed
fix(rdb): retry cleanup on 409 conflicts with exponential backoff
1 parent 071525b commit f6de0b8

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

internal/namespaces/rdb/v1/custom_benchmark_test.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"os"
88
"sort"
9+
"strings"
910
"sync"
1011
"testing"
1112
"time"
@@ -107,12 +108,26 @@ func setupBenchmark(b *testing.B) (*scw.Client, core.TestMetadata, func(args []s
107108
func cleanupWithRetry(b *testing.B, name string, resourceID string, cleanupFn func() error) {
108109
b.Helper()
109110

110-
if err := cleanupFn(); err != nil {
111-
b.Logf("cleanup failed (%s=%s): %v; retrying...", name, resourceID, err)
112-
time.Sleep(2 * time.Second)
113-
if err2 := cleanupFn(); err2 != nil {
114-
b.Errorf("final cleanup failure (%s=%s): %v", name, resourceID, err2)
111+
maxRetries := 5
112+
for i := 0; i < maxRetries; i++ {
113+
err := cleanupFn()
114+
if err == nil {
115+
return
116+
}
117+
118+
// Check if it's a 409 conflict (resource in transient state)
119+
errMsg := err.Error()
120+
if strings.Contains(errMsg, "409") || strings.Contains(errMsg, "Conflict") || strings.Contains(errMsg, "transient state") {
121+
if i < maxRetries-1 {
122+
waitTime := time.Duration(2*(i+1)) * time.Second
123+
b.Logf("cleanup conflict for %s=%s (attempt %d/%d), waiting %v: %v", name, resourceID, i+1, maxRetries, waitTime, err)
124+
time.Sleep(waitTime)
125+
continue
126+
}
115127
}
128+
129+
b.Errorf("cleanup failure (%s=%s) after %d attempts: %v", name, resourceID, i+1, err)
130+
return
116131
}
117132
}
118133

0 commit comments

Comments
 (0)