in dialer.go [174:218]
func (s *SentinelDialer) watchForReelection(backoff backoff.BackOff, currentMaster string, closer <-chan struct{}) (err error) {
for {
// First off, subscribe to master changes.
psc, err := s.subscribeToElections()
if err != nil {
return err
}
// Validate the master is current after we set up the pubsub conn
// to avoid races.
if master, err := s.getMaster(); err != nil || master != currentMaster {
psc.Close()
return err
}
recvd := make(chan struct{})
go func() {
select {
case <-closer:
psc.Close()
case <-recvd:
}
}()
// Wait until we get a message on the pubsub channel. Once we do and
// if it's a subscription message, return.
backoff.Reset()
_, didReelect := psc.Receive().(redis.Message)
close(recvd)
psc.Close()
if didReelect {
return nil
}
// Otherwise, loop through if we didn't close intentionally.. Occasional
// crashes and timeouts are expected. If we can't connect to anyone
// else, the next loop iteration will return an error.
select {
case <-closer:
return nil
default:
}
}
}