Skip to content

Commit 63392a3

Browse files
committed
fix: return early when context signals done
1 parent c561f3c commit 63392a3

File tree

1 file changed

+55
-20
lines changed

1 file changed

+55
-20
lines changed

sentinel.go

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

587622
func parseReplicaAddrs(addrs []map[string]string, keepDisconnected bool) []string {

0 commit comments

Comments
 (0)