From 775f5fa89c50eb1c52edf8ad8414f6be09fc9a97 Mon Sep 17 00:00:00 2001 From: Deluan Date: Mon, 30 Jun 2025 17:53:48 -0400 Subject: [PATCH] fix: improve cache buffering logic Refactored the cache buffering logic to ensure thread safety when checking the buffer length Signed-off-by: Deluan --- core/artwork/cache_warmer.go | 7 +++++-- core/artwork/cache_warmer_test.go | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/artwork/cache_warmer.go b/core/artwork/cache_warmer.go index 2e60ca00b..909d299d8 100644 --- a/core/artwork/cache_warmer.go +++ b/core/artwork/cache_warmer.go @@ -96,8 +96,11 @@ func (a *cacheWarmer) run(ctx context.Context) { // If cache not available, keep waiting if !a.cache.Available(ctx) { - if len(a.buffer) > 0 { - log.Trace(ctx, "Cache not available, buffering precache request", "bufferLen", len(a.buffer)) + a.mutex.Lock() + bufferLen := len(a.buffer) + a.mutex.Unlock() + if bufferLen > 0 { + log.Trace(ctx, "Cache not available, buffering precache request", "bufferLen", bufferLen) } continue } diff --git a/core/artwork/cache_warmer_test.go b/core/artwork/cache_warmer_test.go index d35fb6e82..4125d6de0 100644 --- a/core/artwork/cache_warmer_test.go +++ b/core/artwork/cache_warmer_test.go @@ -80,6 +80,7 @@ var _ = Describe("CacheWarmer", func() { }) It("adds multiple items to buffer", func() { + fc.SetReady(false) // Make cache unavailable so items stay in buffer cw := NewCacheWarmer(aw, fc).(*cacheWarmer) cw.PreCache(model.MustParseArtworkID("al-1")) cw.PreCache(model.MustParseArtworkID("al-2")) @@ -214,3 +215,7 @@ func (f *mockFileCache) SetDisabled(v bool) { f.disabled.Store(v) f.ready.Store(true) } + +func (f *mockFileCache) SetReady(v bool) { + f.ready.Store(v) +}