integration/cluster.go
func (c *cluster) waitLeader(t testing.TB, membs []*member) int {
	possibleLead := make(map[uint64]bool)
	var lead uint64
	for _, m := range membs {
		possibleLead[uint64(m.s.ID())] = true
	}
	cc := MustNewHTTPClient(t, getMembersURLs(membs), nil)
	kapi := client.NewKeysAPI(cc)

	// ensure leader is up via linearizable get
	for {
		ctx, cancel := context.WithTimeout(context.Background(), 10*tickDuration+time.Second)
		_, err := kapi.Get(ctx, "0", &client.GetOptions{Quorum: true})
		cancel()
		if err == nil || strings.Contains(err.Error(), "Key not found") {
			break
		}
	}

	for lead == 0 || !possibleLead[lead] {
		lead = 0
		for _, m := range membs {
			select {
			case <-m.s.StopNotify():
				continue
			default:
			}
			if lead != 0 && lead != m.s.Lead() {
				lead = 0
				time.Sleep(10 * tickDuration)
				break
			}
			lead = m.s.Lead()
		}
	}

	for i, m := range membs {
		if uint64(m.s.ID()) == lead {
			return i
		}
	}

	return -1
}
func (c *cluster) waitLeader(t testing.TB, membs []*member) int {
	possibleLead := make(map[uint64]bool)
	var lead uint64
	for _, m := range membs {
		possibleLead[uint64(m.s.ID())] = true
	}
	cc := MustNewHTTPClient(t, getMembersURLs(membs), nil)
	kapi := client.NewKeysAPI(cc)

	// ensure leader is up via linearizable get
	for {
		ctx, cancel := context.WithTimeout(context.Background(), 10*tickDuration+time.Second)
		_, err := kapi.Get(ctx, "0", &client.GetOptions{Quorum: true})
		cancel()
		if err == nil || strings.Contains(err.Error(), "Key not found") {
			break
		}
	}

	for lead == 0 || !possibleLead[lead] {
		lead = 0
		for _, m := range membs {
			select {
			case <-m.s.StopNotify():
				continue
			default:
			}
			if lead != 0 && lead != m.s.Lead() {
				lead = 0
				time.Sleep(10 * tickDuration)
				break
			}
			lead = m.s.Lead()
		}
	}

	for i, m := range membs {
		if uint64(m.s.ID()) == lead {
			return i
		}
	}

	return -1
}
func ( c * cluster ) waitLeader ( t testing . TB , membs [ ] * member ) int { possibleLead := make ( map [ uint64 ] bool ) var lead uint64 for _ , m := range membs { possibleLead [ uint64 ( m . s . ID ( ) ) ] = true } cc := MustNewHTTPClient ( t , getMembersURLs ( membs ) , nil ) kapi := client . NewKeysAPI ( cc ) // ensure leader is up via linearizable get for { ctx , cancel := context . WithTimeout ( context . Background ( ) , 10 * tickDuration + time . Second ) _ , err := kapi . Get ( ctx , " " , & client . GetOptions { Quorum : true } ) cancel ( ) if err == nil || strings . Contains ( err . Error ( ) , " " ) { break } } for lead == 0 || ! possibleLead [ lead ] { lead = 0 for _ , m := range membs { select { case <- m . s . StopNotify ( ) : continue default : } if lead != 0 && lead != m . s . Lead ( ) { lead = 0 time . Sleep ( 10 * tickDuration ) break } lead = m . s . Lead ( ) } } for i , m := range membs { if uint64 ( m . s . ID ( ) ) == lead { return i } } return - 1 }
// waitLeader waits until given members agree on the same leader.
waitLeader waits until given members agree on the same leader .