diff --git a/server/etcdserver/api/v3compactor/periodic_test.go b/server/etcdserver/api/v3compactor/periodic_test.go index 5604dabc5ef9..e8658f420fa2 100644 --- a/server/etcdserver/api/v3compactor/periodic_test.go +++ b/server/etcdserver/api/v3compactor/periodic_test.go @@ -16,6 +16,7 @@ package v3compactor import ( "errors" + "fmt" "reflect" "testing" "time" @@ -49,7 +50,7 @@ func TestPeriodicHourly(t *testing.T) { } // very first compaction - a, err := compactable.Wait(1) + a, err := waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -67,7 +68,7 @@ func TestPeriodicHourly(t *testing.T) { fc.Advance(tb.getRetryInterval()) } - a, err = compactable.Wait(1) + a, err = waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -100,7 +101,7 @@ func TestPeriodicMinutes(t *testing.T) { } // very first compaction - a, err := compactable.Wait(1) + a, err := waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -117,7 +118,7 @@ func TestPeriodicMinutes(t *testing.T) { fc.Advance(tb.getRetryInterval()) } - a, err := compactable.Wait(1) + a, err := waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -162,7 +163,7 @@ func TestPeriodicPause(t *testing.T) { fc.Advance(tb.getRetryInterval()) // T=3h6m - a, err := compactable.Wait(1) + a, err := waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -197,7 +198,7 @@ func TestPeriodicSkipRevNotChange(t *testing.T) { } // very first compaction - a, err := compactable.Wait(1) + a, err := waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -228,7 +229,7 @@ func TestPeriodicSkipRevNotChange(t *testing.T) { fc.Advance(tb.getRetryInterval()) } - a, err = compactable.Wait(1) + a, err = waitWithRetry(t, compactable) if err != nil { t.Fatal(err) } @@ -244,3 +245,23 @@ func waitOneAction(t *testing.T, r testutil.Recorder) { t.Errorf("expect 1 action, got %v instead", len(actions)) } } + +func waitWithRetry(t *testing.T, compactable *fakeCompactable) ([]testutil.Action, error) { + t.Helper() + + var lastErr error + var actions []testutil.Action + + expectedActions, maxRetries := 1, 5 + for retry := 0; retry < maxRetries; retry++ { + actions, lastErr = compactable.Wait(expectedActions) + if lastErr == nil || len(actions) >= expectedActions { + return actions, nil + } + // Exponential backoff + backoffTime := time.Duration(10*(1<