From 98fe77311f7c554da78eeb2f9278f6f9d2066b2f Mon Sep 17 00:00:00 2001 From: Rudrakh Panigrahi Date: Tue, 30 Sep 2025 22:41:24 +0530 Subject: [PATCH] perf: fix possible mem leak in XDS snapshot Signed-off-by: Rudrakh Panigrahi --- internal/xds/cache/snapshotcache.go | 8 +++++++- internal/xds/runner/runner_test.go | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/xds/cache/snapshotcache.go b/internal/xds/cache/snapshotcache.go index 61b923f22c..6c989b37e4 100644 --- a/internal/xds/cache/snapshotcache.go +++ b/internal/xds/cache/snapshotcache.go @@ -90,7 +90,13 @@ func (s *snapshotCache) GenerateNewSnapshot(irKey string, resources types.XdsRes } xdsSnapshotCreateTotal.WithSuccess().Increment() - s.lastSnapshot[irKey] = snapshot + // Delete snapshot from cache if resources are nil + if resources == nil { + delete(s.lastSnapshot, irKey) + } else { + // Update snapshot in cache + s.lastSnapshot[irKey] = snapshot + } for _, node := range s.getNodeIDs(irKey) { s.log.Debugf("Generating a snapshot with Node %s", node) diff --git a/internal/xds/runner/runner_test.go b/internal/xds/runner/runner_test.go index 154edbdb8c..bb666ead0f 100644 --- a/internal/xds/runner/runner_test.go +++ b/internal/xds/runner/runner_test.go @@ -318,7 +318,7 @@ func TestRunner(t *testing.T) { xdsIR.Delete("test") require.Eventually(t, func() bool { // Wait for the IR to be empty after deletion - return len(xdsIR.LoadAll()) == 0 + return !r.cache.SnapshotHasIrKey("test") && len(xdsIR.LoadAll()) == 0 }, time.Second*5, time.Millisecond*50) }