From e7fd8b150cb45c7ab3a6726144fc02a9faa36c9a Mon Sep 17 00:00:00 2001 From: isabel Date: Sat, 4 Jul 2026 20:47:49 +0100 Subject: [PATCH] perf(musicbrainz): cap search cache size --- service/musicbrainz/musicbrainz.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/service/musicbrainz/musicbrainz.go b/service/musicbrainz/musicbrainz.go index f55c9c7..9817559 100644 --- a/service/musicbrainz/musicbrainz.go +++ b/service/musicbrainz/musicbrainz.go @@ -73,6 +73,9 @@ type SearchParams struct { ISRC string } +// maxSearchCacheEntries caps the search cache size. +const maxSearchCacheEntries = 1000 + // cacheEntry holds the cached data and its expiration time. type cacheEntry struct { recordings []Recording @@ -169,6 +172,18 @@ func (s *Service) setCacheEntry(cacheKey string, recordings []Recording) { delete(s.searchCache, key) } } + // Cap the cache size by evicting the entry closest to expiry. + if len(s.searchCache) >= maxSearchCacheEntries { + var oldestKey string + var oldestExpiry time.Time + for key, entry := range s.searchCache { + if oldestKey == "" || entry.expiresAt.Before(oldestExpiry) { + oldestKey = key + oldestExpiry = entry.expiresAt + } + } + delete(s.searchCache, oldestKey) + } s.searchCache[cacheKey] = cacheEntry{ recordings: recordings, expiresAt: now.Add(s.cacheTTL), -- 2.51.2