diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index 3059f01..687a74e 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,9 @@ 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 + // A pooled SimpleRedis holds a mutex, so it is kept by pointer: + // appending it by value would copy the lock along with it. + 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)