From 3ebd76891ad8dfc0a8e3d6ba5d4d8d47bdc1f26c Mon Sep 17 00:00:00 2001 From: Nick Petrovic <4001122+nickpetrovic@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:11:46 -0500 Subject: [PATCH 1/2] fix: concurrent map iteration and map write panic --- pkg/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/client.go b/pkg/client.go index f82ac15..80bb08a 100644 --- a/pkg/client.go +++ b/pkg/client.go @@ -331,13 +331,13 @@ func (c *BlobCacheClient) manageLocalClientCache(ttl time.Duration, interval tim case <-ticker.C: now := time.Now() + c.mu.Lock() for hash, entry := range c.localHostCache { if now.Sub(entry.timestamp) > ttl { - c.mu.Lock() delete(c.localHostCache, hash) - c.mu.Unlock() } } + c.mu.Unlock() case <-c.ctx.Done(): return From c09c58747a346d46ff4493f3f55885dee4fedc40 Mon Sep 17 00:00:00 2001 From: Nick Petrovic <4001122+nickpetrovic@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:24:54 -0500 Subject: [PATCH 2/2] lock on delete --- pkg/client.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/client.go b/pkg/client.go index 80bb08a..845184d 100644 --- a/pkg/client.go +++ b/pkg/client.go @@ -330,13 +330,18 @@ func (c *BlobCacheClient) manageLocalClientCache(ttl time.Duration, interval tim select { case <-ticker.C: now := time.Now() + stale := make([]string, 0) - c.mu.Lock() for hash, entry := range c.localHostCache { if now.Sub(entry.timestamp) > ttl { - delete(c.localHostCache, hash) + stale = append(stale, hash) } } + + c.mu.Lock() + for _, hash := range stale { + delete(c.localHostCache, hash) + } c.mu.Unlock() case <-c.ctx.Done():