Improve autopilot shutdown to be idempotent

This commit is contained in:
Alex Dadgar 2018-02-20 15:51:59 -08:00
parent 4c90fbfd90
commit 33c5afdb31
1 changed files with 20 additions and 0 deletions

View File

@ -38,8 +38,10 @@ type Autopilot struct {
clusterHealth OperatorHealthReply clusterHealth OperatorHealthReply
clusterHealthLock sync.RWMutex clusterHealthLock sync.RWMutex
enabled bool
removeDeadCh chan struct{} removeDeadCh chan struct{}
shutdownCh chan struct{} shutdownCh chan struct{}
shutdownLock sync.Mutex
waitGroup sync.WaitGroup waitGroup sync.WaitGroup
} }
@ -62,6 +64,14 @@ func NewAutopilot(logger *log.Logger, delegate Delegate, interval, healthInterva
} }
func (a *Autopilot) Start() { func (a *Autopilot) Start() {
a.shutdownLock.Lock()
defer a.shutdownLock.Unlock()
// Nothing to do
if a.enabled {
return
}
a.shutdownCh = make(chan struct{}) a.shutdownCh = make(chan struct{})
a.waitGroup = sync.WaitGroup{} a.waitGroup = sync.WaitGroup{}
a.clusterHealth = OperatorHealthReply{} a.clusterHealth = OperatorHealthReply{}
@ -69,11 +79,21 @@ func (a *Autopilot) Start() {
a.waitGroup.Add(2) a.waitGroup.Add(2)
go a.run() go a.run()
go a.serverHealthLoop() go a.serverHealthLoop()
a.enabled = true
} }
func (a *Autopilot) Stop() { func (a *Autopilot) Stop() {
a.shutdownLock.Lock()
defer a.shutdownLock.Unlock()
// Nothing to do
if !a.enabled {
return
}
close(a.shutdownCh) close(a.shutdownCh)
a.waitGroup.Wait() a.waitGroup.Wait()
a.enabled = false
} }
// run periodically looks for nonvoting servers to promote and dead servers to remove. // run periodically looks for nonvoting servers to promote and dead servers to remove.