@@ -472,8 +472,15 @@ func (c *sentinelFailover) MasterAddr(ctx context.Context) (string, error) {
472472 c .mu .RUnlock ()
473473
474474 if sentinel != nil {
475- addr := c .getMasterAddr (ctx , sentinel )
476- if addr != "" {
475+ addr , err := c .getMasterAddr (ctx , sentinel )
476+ if err != nil {
477+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
478+ return "" , err
479+ }
480+ // Continue on other errors
481+ internal .Logger .Printf (ctx , "sentinel: GetMasterAddrByName name=%q failed: %s" ,
482+ c .opt .MasterName , err )
483+ } else {
477484 return addr , nil
478485 }
479486 }
@@ -482,21 +489,31 @@ func (c *sentinelFailover) MasterAddr(ctx context.Context) (string, error) {
482489 defer c .mu .Unlock ()
483490
484491 if c .sentinel != nil {
485- addr := c .getMasterAddr (ctx , c .sentinel )
486- if addr != "" {
492+ addr , err := c .getMasterAddr (ctx , c .sentinel )
493+ if err != nil {
494+ _ = c .closeSentinel ()
495+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
496+ return "" , err
497+ }
498+ // Continue on other errors
499+ internal .Logger .Printf (ctx , "sentinel: GetMasterAddrByName name=%q failed: %s" ,
500+ c .opt .MasterName , err )
501+ } else {
487502 return addr , nil
488503 }
489- _ = c .closeSentinel ()
490504 }
491505
492506 for i , sentinelAddr := range c .sentinelAddrs {
493507 sentinel := NewSentinelClient (c .opt .sentinelOptions (sentinelAddr ))
494508
495509 masterAddr , err := sentinel .GetMasterAddrByName (ctx , c .opt .MasterName ).Result ()
496510 if err != nil {
511+ _ = sentinel .Close ()
512+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
513+ return "" , err
514+ }
497515 internal .Logger .Printf (ctx , "sentinel: GetMasterAddrByName master=%q failed: %s" ,
498516 c .opt .MasterName , err )
499- _ = sentinel .Close ()
500517 continue
501518 }
502519
@@ -517,8 +534,15 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
517534 c .mu .RUnlock ()
518535
519536 if sentinel != nil {
520- addrs := c .getReplicaAddrs (ctx , sentinel )
521- if len (addrs ) > 0 {
537+ addrs , err := c .getReplicaAddrs (ctx , sentinel )
538+ if err != nil {
539+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
540+ return nil , err
541+ }
542+ // Continue on other errors
543+ internal .Logger .Printf (ctx , "sentinel: Replicas name=%q failed: %s" ,
544+ c .opt .MasterName , err )
545+ } else if len (addrs ) > 0 {
522546 return addrs , nil
523547 }
524548 }
@@ -527,11 +551,21 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
527551 defer c .mu .Unlock ()
528552
529553 if c .sentinel != nil {
530- addrs := c .getReplicaAddrs (ctx , c .sentinel )
531- if len (addrs ) > 0 {
554+ addrs , err := c .getReplicaAddrs (ctx , c .sentinel )
555+ if err != nil {
556+ _ = c .closeSentinel ()
557+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
558+ return nil , err
559+ }
560+ // Continue on other errors
561+ internal .Logger .Printf (ctx , "sentinel: Replicas name=%q failed: %s" ,
562+ c .opt .MasterName , err )
563+ } else if len (addrs ) > 0 {
532564 return addrs , nil
565+ } else {
566+ // No error and no replicas.
567+ _ = c .closeSentinel ()
533568 }
534- _ = c .closeSentinel ()
535569 }
536570
537571 var sentinelReachable bool
@@ -541,9 +575,12 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
541575
542576 replicas , err := sentinel .Replicas (ctx , c .opt .MasterName ).Result ()
543577 if err != nil {
578+ _ = sentinel .Close ()
579+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
580+ return nil , err
581+ }
544582 internal .Logger .Printf (ctx , "sentinel: Replicas master=%q failed: %s" ,
545583 c .opt .MasterName , err )
546- _ = sentinel .Close ()
547584 continue
548585 }
549586 sentinelReachable = true
@@ -564,24 +601,22 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
564601 return []string {}, errors .New ("redis: all sentinels specified in configuration are unreachable" )
565602}
566603
567- func (c * sentinelFailover ) getMasterAddr (ctx context.Context , sentinel * SentinelClient ) string {
604+ func (c * sentinelFailover ) getMasterAddr (ctx context.Context , sentinel * SentinelClient ) ( string , error ) {
568605 addr , err := sentinel .GetMasterAddrByName (ctx , c .opt .MasterName ).Result ()
569606 if err != nil {
570- internal .Logger .Printf (ctx , "sentinel: GetMasterAddrByName name=%q failed: %s" ,
571- c .opt .MasterName , err )
572- return ""
607+ return "" , err
573608 }
574- return net .JoinHostPort (addr [0 ], addr [1 ])
609+ return net .JoinHostPort (addr [0 ], addr [1 ]), nil
575610}
576611
577- func (c * sentinelFailover ) getReplicaAddrs (ctx context.Context , sentinel * SentinelClient ) []string {
612+ func (c * sentinelFailover ) getReplicaAddrs (ctx context.Context , sentinel * SentinelClient ) ( []string , error ) {
578613 addrs , err := sentinel .Replicas (ctx , c .opt .MasterName ).Result ()
579614 if err != nil {
580615 internal .Logger .Printf (ctx , "sentinel: Replicas name=%q failed: %s" ,
581616 c .opt .MasterName , err )
582- return nil
617+ return nil , err
583618 }
584- return parseReplicaAddrs (addrs , false )
619+ return parseReplicaAddrs (addrs , false ), nil
585620}
586621
587622func parseReplicaAddrs (addrs []map [string ]string , keepDisconnected bool ) []string {
0 commit comments