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