in store/engine/etcd/etcd.go [217:254]
func (e *Etcd) electLoop(ctx context.Context) {
defer e.wg.Done()
for {
select {
case <-e.quitCh:
return
default:
}
reset:
session, err := concurrency.NewSession(e.client, concurrency.WithTTL(sessionTTL))
if err != nil {
logger.Get().With(
zap.Error(err),
).Error("Failed to create session")
time.Sleep(sessionTTL / 3)
continue
}
election := concurrency.NewElection(session, e.electPath)
e.electionCh <- election
for {
if err := election.Campaign(ctx, e.myID); err != nil {
logger.Get().With(
zap.Error(err),
).Error("Failed to acquire the leader campaign")
continue
}
select {
case <-session.Done():
logger.Get().Warn("Leader session is done")
goto reset
case <-e.quitCh:
logger.Get().Info("Exit the leader election loop")
return
}
}
}
}