@@ -11,6 +11,7 @@ import (
1111
1212 "github.com/redis/go-redis/v9/auth"
1313 "github.com/redis/go-redis/v9/internal"
14+ auth2 "github.com/redis/go-redis/v9/internal/auth"
1415 "github.com/redis/go-redis/v9/internal/hscan"
1516 "github.com/redis/go-redis/v9/internal/pool"
1617 "github.com/redis/go-redis/v9/internal/proto"
@@ -225,8 +226,8 @@ type baseClient struct {
225226 maintNotificationsManager * maintnotifications.Manager
226227 maintNotificationsManagerLock sync.RWMutex
227228
228- credListeners map [ * pool. Conn ]auth. CredentialsListener
229- credListenersLock sync. RWMutex
229+ // thread-safe map of pool connections to credentials listeners
230+ credListeners * auth2. CredentialsListeners
230231}
231232
232233func (c * baseClient ) clone () * baseClient {
@@ -304,17 +305,13 @@ func (c *baseClient) _getConn(ctx context.Context) (*pool.Conn, error) {
304305// The credentials listener is stored in a map, so that it can be reused for multiple connections.
305306// The credentials listener is removed from the map when the connection is closed.
306307func (c * baseClient ) connReAuthCredentialsListener (poolCn * pool.Conn ) (auth.CredentialsListener , func ()) {
307- c .credListenersLock .RLock ()
308- credListener , ok := c .credListeners [poolCn ]
309- c .credListenersLock .RUnlock ()
308+ credListener , ok := c .credListeners .Get (poolCn )
310309 if ok {
311310 return credListener , func () {
312- c .removeCredListener (poolCn )
311+ c .credListeners . Remove (poolCn )
313312 }
314313 }
315- c .credListenersLock .Lock ()
316- defer c .credListenersLock .Unlock ()
317- newCredListener := auth .NewConnReAuthCredentialsListener (
314+ newCredListener := auth2 .NewConnReAuthCredentialsListener (
318315 poolCn ,
319316 c .reAuthConnection (),
320317 c .onAuthenticationErr (),
@@ -333,18 +330,12 @@ func (c *baseClient) connReAuthCredentialsListener(poolCn *pool.Conn) (auth.Cred
333330 } else {
334331 newCredListener .SetCheckUsableTimeout (c .opt .PoolTimeout )
335332 }
336- c .credListeners [ poolCn ] = newCredListener
333+ c .credListeners . Add ( poolCn , newCredListener )
337334 return newCredListener , func () {
338- c .removeCredListener (poolCn )
335+ c .credListeners . Remove (poolCn )
339336 }
340337}
341338
342- func (c * baseClient ) removeCredListener (poolCn * pool.Conn ) {
343- c .credListenersLock .Lock ()
344- defer c .credListenersLock .Unlock ()
345- delete (c .credListeners , poolCn )
346- }
347-
348339func (c * baseClient ) reAuthConnection () func (poolCn * pool.Conn , credentials auth.Credentials ) error {
349340 return func (poolCn * pool.Conn , credentials auth.Credentials ) error {
350341 var err error
@@ -1005,9 +996,7 @@ func NewClient(opt *Options) *Client {
1005996 panic (fmt .Errorf ("redis: failed to create pubsub pool: %w" , err ))
1006997 }
1007998
1008- if c .opt .StreamingCredentialsProvider != nil {
1009- c .credListeners = make (map [* pool.Conn ]auth.CredentialsListener )
1010- }
999+ c .credListeners = auth2 .NewCredentialsListeners ()
10111000
10121001 // Initialize maintnotifications first if enabled and protocol is RESP3
10131002 if opt .MaintNotificationsConfig != nil && opt .MaintNotificationsConfig .Mode != maintnotifications .ModeDisabled && opt .Protocol == 3 {
0 commit comments