consul: Clear peer set on leave. Fixes #69

This commit is contained in:
Armon Dadgar 2014-04-23 11:39:45 -07:00
parent 9175a4e7c3
commit d581af7692
1 changed files with 12 additions and 1 deletions

View File

@ -55,6 +55,9 @@ type Server struct {
// strong consistency. // strong consistency.
fsm *consulFSM fsm *consulFSM
// Have we attempted to leave the cluster
left bool
// Logger uses the provided LogOutput // Logger uses the provided LogOutput
logger *log.Logger logger *log.Logger
@ -364,6 +367,12 @@ func (s *Server) Shutdown() error {
s.logger.Printf("[WARN] consul: Error shutting down raft: %s", err) s.logger.Printf("[WARN] consul: Error shutting down raft: %s", err)
} }
s.raftStore.Close() s.raftStore.Close()
// Clear the peer set on a graceful leave to avoid
// triggering elections on a rejoin.
if s.left {
s.raftPeers.SetPeers(nil)
}
} }
if s.rpcListener != nil { if s.rpcListener != nil {
@ -391,6 +400,7 @@ func (s *Server) Shutdown() error {
// Leave is used to prepare for a graceful shutdown of the server // Leave is used to prepare for a graceful shutdown of the server
func (s *Server) Leave() error { func (s *Server) Leave() error {
s.logger.Printf("[INFO] consul: server starting leave") s.logger.Printf("[INFO] consul: server starting leave")
s.left = true
// Leave the WAN pool // Leave the WAN pool
if s.serfWAN != nil { if s.serfWAN != nil {
@ -434,7 +444,8 @@ func (s *Server) Leave() error {
// Wait for the commit // Wait for the commit
select { select {
case err := <-ch: case err := <-ch:
if err != nil { // Ignore if we have already been deregistered by the leader
if err != nil && err.Error() != raft.UnknownPeer.Error() {
s.logger.Printf("[ERR] consul: failed to leave Raft cluster: %v", err) s.logger.Printf("[ERR] consul: failed to leave Raft cluster: %v", err)
} }
case <-time.After(3 * time.Second): case <-time.After(3 * time.Second):