Browse Source

Merge pull request #2616 from yichengq/stop-raft

etcdserver: stop raft node goroutine before stop server
Yicheng Qin 10 years ago
parent
commit
a719f78046
2 changed files with 14 additions and 4 deletions
  1. 9 2
      etcdserver/raft.go
  2. 5 2
      etcdserver/server.go

+ 9 - 2
etcdserver/raft.go

@@ -101,9 +101,15 @@ type raftNode struct {
 	index uint64
 	term  uint64
 	lead  uint64
+
+	stopped chan struct{}
+	done    chan struct{}
 }
 
 func (r *raftNode) run() {
+	r.stopped = make(chan struct{})
+	r.done = make(chan struct{})
+
 	var syncC <-chan time.Time
 
 	defer r.stop()
@@ -134,7 +140,7 @@ func (r *raftNode) run() {
 
 			select {
 			case r.applyc <- apply:
-			case <-r.s.done:
+			case <-r.stopped:
 				return
 			}
 
@@ -156,7 +162,7 @@ func (r *raftNode) run() {
 			r.Advance()
 		case <-syncC:
 			r.s.sync(defaultSyncTimeout)
-		case <-r.s.done:
+		case <-r.stopped:
 			return
 		}
 	}
@@ -172,6 +178,7 @@ func (r *raftNode) stop() {
 	if err := r.storage.Close(); err != nil {
 		log.Panicf("etcdraft: close storage error: %v", err)
 	}
+	close(r.done)
 }
 
 // for testing

+ 5 - 2
etcdserver/server.go

@@ -341,7 +341,11 @@ func (s *EtcdServer) run() {
 	s.r.s = s
 	s.r.applyc = make(chan apply)
 	go s.r.run()
-	defer close(s.done)
+	defer func() {
+		s.r.stopped <- struct{}{}
+		<-s.r.done
+		close(s.done)
+	}()
 
 	var shouldstop bool
 	for {
@@ -404,7 +408,6 @@ func (s *EtcdServer) run() {
 			return
 		}
 	}
-	// TODO: wait for the stop of raft node routine?
 }
 
 // Stop stops the server gracefully, and shuts down the running goroutine.