@@ -472,8 +472,15 @@ func (c *sentinelFailover) MasterAddr(ctx context.Context) (string, error) {
472
472
c .mu .RUnlock ()
473
473
474
474
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 {
477
484
return addr , nil
478
485
}
479
486
}
@@ -482,21 +489,31 @@ func (c *sentinelFailover) MasterAddr(ctx context.Context) (string, error) {
482
489
defer c .mu .Unlock ()
483
490
484
491
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 {
487
502
return addr , nil
488
503
}
489
- _ = c .closeSentinel ()
490
504
}
491
505
492
506
for i , sentinelAddr := range c .sentinelAddrs {
493
507
sentinel := NewSentinelClient (c .opt .sentinelOptions (sentinelAddr ))
494
508
495
509
masterAddr , err := sentinel .GetMasterAddrByName (ctx , c .opt .MasterName ).Result ()
496
510
if err != nil {
511
+ _ = sentinel .Close ()
512
+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
513
+ return "" , err
514
+ }
497
515
internal .Logger .Printf (ctx , "sentinel: GetMasterAddrByName master=%q failed: %s" ,
498
516
c .opt .MasterName , err )
499
- _ = sentinel .Close ()
500
517
continue
501
518
}
502
519
@@ -517,8 +534,15 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
517
534
c .mu .RUnlock ()
518
535
519
536
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 {
522
546
return addrs , nil
523
547
}
524
548
}
@@ -527,11 +551,21 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
527
551
defer c .mu .Unlock ()
528
552
529
553
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 {
532
564
return addrs , nil
565
+ } else {
566
+ // No error and no replicas.
567
+ _ = c .closeSentinel ()
533
568
}
534
- _ = c .closeSentinel ()
535
569
}
536
570
537
571
var sentinelReachable bool
@@ -541,9 +575,12 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
541
575
542
576
replicas , err := sentinel .Replicas (ctx , c .opt .MasterName ).Result ()
543
577
if err != nil {
578
+ _ = sentinel .Close ()
579
+ if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
580
+ return nil , err
581
+ }
544
582
internal .Logger .Printf (ctx , "sentinel: Replicas master=%q failed: %s" ,
545
583
c .opt .MasterName , err )
546
- _ = sentinel .Close ()
547
584
continue
548
585
}
549
586
sentinelReachable = true
@@ -564,24 +601,22 @@ func (c *sentinelFailover) replicaAddrs(ctx context.Context, useDisconnected boo
564
601
return []string {}, errors .New ("redis: all sentinels specified in configuration are unreachable" )
565
602
}
566
603
567
- func (c * sentinelFailover ) getMasterAddr (ctx context.Context , sentinel * SentinelClient ) string {
604
+ func (c * sentinelFailover ) getMasterAddr (ctx context.Context , sentinel * SentinelClient ) ( string , error ) {
568
605
addr , err := sentinel .GetMasterAddrByName (ctx , c .opt .MasterName ).Result ()
569
606
if err != nil {
570
- internal .Logger .Printf (ctx , "sentinel: GetMasterAddrByName name=%q failed: %s" ,
571
- c .opt .MasterName , err )
572
- return ""
607
+ return "" , err
573
608
}
574
- return net .JoinHostPort (addr [0 ], addr [1 ])
609
+ return net .JoinHostPort (addr [0 ], addr [1 ]), nil
575
610
}
576
611
577
- func (c * sentinelFailover ) getReplicaAddrs (ctx context.Context , sentinel * SentinelClient ) []string {
612
+ func (c * sentinelFailover ) getReplicaAddrs (ctx context.Context , sentinel * SentinelClient ) ( []string , error ) {
578
613
addrs , err := sentinel .Replicas (ctx , c .opt .MasterName ).Result ()
579
614
if err != nil {
580
615
internal .Logger .Printf (ctx , "sentinel: Replicas name=%q failed: %s" ,
581
616
c .opt .MasterName , err )
582
- return nil
617
+ return nil , err
583
618
}
584
- return parseReplicaAddrs (addrs , false )
619
+ return parseReplicaAddrs (addrs , false ), nil
585
620
}
586
621
587
622
func parseReplicaAddrs (addrs []map [string ]string , keepDisconnected bool ) []string {
0 commit comments