From 3ceb9617f2db2435a92d887f7c8a30da44b46930 Mon Sep 17 00:00:00 2001 From: mhx Date: Fri, 4 Sep 2026 11:02:13 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20cache:=20keep=20redis=20re?= =?UTF-8?q?aders=20by=20pointer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A pooled SimpleRedis holds a sync.Mutex, so appending one into rc.readers by value copies the lock and trips go vet's copylocks check. Keep the readers by pointer instead; the round-robin over replicas is unchanged. Co-Authored-By: Claude Opus 5 (1M context) --- pkg/cache/cache.go | 6 +++--- pkg/cache/cache_test.go | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index 3059f01..8cb9411 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -52,7 +52,7 @@ func (localCache) delete(key string) { type redisCache struct { log *slog.Logger writer simpleredis.SimpleRedis - readers []simpleredis.SimpleRedis + readers []*simpleredis.SimpleRedis counter atomic.Uint64 } @@ -62,7 +62,7 @@ func (rc *redisCache) nextReader() *simpleredis.SimpleRedis { return &rc.writer } idx := rc.counter.Add(1) % uint64(n) - return &rc.readers[idx] + return rc.readers[idx] } func (rc *redisCache) get(key string) (string, error) { @@ -115,7 +115,7 @@ func (c *Client) New(log *slog.Logger, isRedis bool, writeHost string, readHosts rc := &redisCache{log: log} rc.writer.Init(writeHost, pass, database) for _, h := range readHosts { - var r simpleredis.SimpleRedis + r := &simpleredis.SimpleRedis{} r.Init(h, pass, database) rc.readers = append(rc.readers, r) } diff --git a/pkg/cache/cache_test.go b/pkg/cache/cache_test.go index 3aa3aea..ec114be 100644 --- a/pkg/cache/cache_test.go +++ b/pkg/cache/cache_test.go @@ -130,7 +130,7 @@ func indexOfReader(rc *redisCache, r *simpleredis.SimpleRedis) int { return -1 } for i := range rc.readers { - if r == &rc.readers[i] { + if r == rc.readers[i] { return i } } @@ -151,7 +151,10 @@ func Test_nextReader(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { rc := &redisCache{log: logger.New("INFO", "")} - rc.readers = make([]simpleredis.SimpleRedis, tt.readers) + rc.readers = make([]*simpleredis.SimpleRedis, tt.readers) + for i := range rc.readers { + rc.readers[i] = &simpleredis.SimpleRedis{} + } for call, want := range tt.want { if got := indexOfReader(rc, rc.nextReader()); got != want { t.Errorf("call %d: nextReader() -> reader[%d], want reader[%d]", call, got, want)