func()

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:
		}
	}
}