From 4d99696f024e081c29b7d272a74e1a34e5f06841 Mon Sep 17 00:00:00 2001 From: Alex Dadgar Date: Tue, 20 Feb 2018 15:51:59 -0800 Subject: [PATCH] Improve autopilot shutdown to be idempotent --- agent/consul/autopilot/autopilot.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/agent/consul/autopilot/autopilot.go b/agent/consul/autopilot/autopilot.go index d6efd11e7..b50252ce5 100644 --- a/agent/consul/autopilot/autopilot.go +++ b/agent/consul/autopilot/autopilot.go @@ -38,8 +38,10 @@ type Autopilot struct { clusterHealth OperatorHealthReply clusterHealthLock sync.RWMutex + enabled bool removeDeadCh chan struct{} shutdownCh chan struct{} + shutdownLock sync.Mutex waitGroup sync.WaitGroup } @@ -62,6 +64,14 @@ func NewAutopilot(logger *log.Logger, delegate Delegate, interval, healthInterva } func (a *Autopilot) Start() { + a.shutdownLock.Lock() + defer a.shutdownLock.Unlock() + + // Nothing to do + if a.enabled { + return + } + a.shutdownCh = make(chan struct{}) a.waitGroup = sync.WaitGroup{} a.clusterHealth = OperatorHealthReply{} @@ -69,11 +79,21 @@ func (a *Autopilot) Start() { a.waitGroup.Add(2) go a.run() go a.serverHealthLoop() + a.enabled = true } func (a *Autopilot) Stop() { + a.shutdownLock.Lock() + defer a.shutdownLock.Unlock() + + // Nothing to do + if !a.enabled { + return + } + close(a.shutdownCh) a.waitGroup.Wait() + a.enabled = false } // run periodically looks for nonvoting servers to promote and dead servers to remove.