Skip to content

Commit b4ae24d

Browse files
committed
consul: Clear peer set on leave. Fixes #69
1 parent b8d185a commit b4ae24d

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

consul/server.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ type Server struct {
5555
// strong consistency.
5656
fsm *consulFSM
5757

58+
// Have we attempted to leave the cluster
59+
left bool
60+
5861
// Logger uses the provided LogOutput
5962
logger *log.Logger
6063

@@ -364,6 +367,12 @@ func (s *Server) Shutdown() error {
364367
s.logger.Printf("[WARN] consul: Error shutting down raft: %s", err)
365368
}
366369
s.raftStore.Close()
370+
371+
// Clear the peer set on a graceful leave to avoid
372+
// triggering elections on a rejoin.
373+
if s.left {
374+
s.raftPeers.SetPeers(nil)
375+
}
367376
}
368377

369378
if s.rpcListener != nil {
@@ -391,6 +400,7 @@ func (s *Server) Shutdown() error {
391400
// Leave is used to prepare for a graceful shutdown of the server
392401
func (s *Server) Leave() error {
393402
s.logger.Printf("[INFO] consul: server starting leave")
403+
s.left = true
394404

395405
// Leave the WAN pool
396406
if s.serfWAN != nil {
@@ -434,7 +444,8 @@ func (s *Server) Leave() error {
434444
// Wait for the commit
435445
select {
436446
case err := <-ch:
437-
if err != nil {
447+
// Ignore if we have already been deregistered by the leader
448+
if err != nil && err.Error() != raft.UnknownPeer.Error() {
438449
s.logger.Printf("[ERR] consul: failed to leave Raft cluster: %v", err)
439450
}
440451
case <-time.After(3 * time.Second):

0 commit comments

Comments
 (0)