func()

in store/engine/zookeeper/zookeeper.go [221:264]


func (e *Zookeeper) electLoop(ctx context.Context) {
	defer e.wg.Done()
reset:
	select {
	case <-e.quitCh:
		return
	default:
	}
	err := e.Create(ctx, e.electPath, []byte(e.myID), zk.FlagEphemeral)
	if err != nil && !errors.Is(err, zk.ErrNodeExists) {
		time.Sleep(sessionTTL / 3)
		goto reset
	}
	data, _, ch, err := e.conn.GetW(e.electPath)
	if err != nil {
		time.Sleep(sessionTTL / 3)
		goto reset
	}
	e.SetleaderID(string(data))

	for {
		select {
		case resp := <-ch:
			if resp.Type == zk.EventNodeDeleted {
				err := e.Create(ctx, e.electPath, []byte(e.myID), zk.FlagEphemeral)
				if err != nil && !errors.Is(err, zk.ErrNodeExists) {
					time.Sleep(sessionTTL / 3)
					goto reset
				}
			}
			data, _, ch, err = e.conn.GetW(e.electPath)
			if err != nil {
				time.Sleep(sessionTTL / 3)
				goto reset
			}
			e.SetleaderID(string(data))
		case <-e.quitCh:
			logger.Get().Info(e.myID + " Exit the leader election loop")
			return
		}

	}

}