Skip to content

Commit

Permalink
Merge pull request #3908 from hashicorp/f-improved-autopilot-shutdown
Browse files Browse the repository at this point in the history
Improve autopilot shutdown to be idempotent
  • Loading branch information
dadgar authored Feb 21, 2018
2 parents 4c90fbf + 18bf964 commit d1ede2c
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
20 changes: 20 additions & 0 deletions agent/consul/autopilot/autopilot.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -62,18 +64,36 @@ 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{}

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.
Expand Down
14 changes: 14 additions & 0 deletions agent/consul/autopilot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,20 @@ import (
"github.com/hashicorp/serf/serf"
)

func TestAutopilot_IdempotentShutdown(t *testing.T) {
dir1, s1 := testServerWithConfig(t, nil)
defer os.RemoveAll(dir1)
defer s1.Shutdown()
retry.Run(t, func(r *retry.R) { r.Check(waitForLeader(s1)) })

s1.autopilot.Start()
s1.autopilot.Start()
s1.autopilot.Start()
s1.autopilot.Stop()
s1.autopilot.Stop()
s1.autopilot.Stop()
}

func TestAutopilot_CleanupDeadServer(t *testing.T) {
t.Parallel()
for i := 1; i <= 3; i++ {
Expand Down

0 comments on commit d1ede2c

Please sign in to comment.