From f7029fdb75799ba657e192d164df2c685aebb5c0 Mon Sep 17 00:00:00 2001 From: HossamSaberX Date: Sun, 18 Jan 2026 05:57:40 +0200 Subject: [PATCH] cache: deflake TestCacheCompactionResync The test had a race condition where Phase 3 checked lastStartRev before the cache finished updating it. The mw.registered channel was already closed from Phase 1, so <-mw.registered returned immediately instead of waiting. Fix: Add resetRegistered() to create a fresh channel for Phase 3, ensuring the test properly waits for the cache to complete recovery. Fixes #21150 Signed-off-by: HossamSaberX --- cache/cache_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cache/cache_test.go b/cache/cache_test.go index 0ce412e95..377c1ed11 100644 --- a/cache/cache_test.go +++ b/cache/cache_test.go @@ -455,7 +455,9 @@ func TestCacheCompactionResync(t *testing.T) { } t.Log("Phase 3: resync after compaction") + mw.resetRegistered() mw.triggerCreatedNotify() + <-mw.registered expectSnapshotRev := int64(20) ctxResync, cancelResync := context.WithTimeout(t.Context(), time.Second) defer cancelResync() @@ -558,6 +560,8 @@ func (m *mockWatcher) getLastStartRev() int64 { } func (m *mockWatcher) signalRegistration() { + m.mu.Lock() + defer m.mu.Unlock() select { case <-m.registered: default: @@ -565,6 +569,12 @@ func (m *mockWatcher) signalRegistration() { } } +func (m *mockWatcher) resetRegistered() { + m.mu.Lock() + defer m.mu.Unlock() + m.registered = make(chan struct{}) +} + func (m *mockWatcher) streamResponses(ctx context.Context, out chan<- clientv3.WatchResponse) { defer func() { close(out)