瀏覽代碼

etcdsever: fix the leaky snashot routine issue

Xiang Li 9 年之前
父節點
當前提交
4991cda202
共有 1 個文件被更改,包括 9 次插入0 次删除
  1. 9 0
      etcdserver/server.go

+ 9 - 0
etcdserver/server.go

@@ -208,6 +208,10 @@ type EtcdServer struct {
 	forceVersionC chan struct{}
 
 	msgSnapC chan raftpb.Message
+
+	// wg is used to wait for the go routines that depends on the server state
+	// to exit when stopping the server.
+	wg sync.WaitGroup
 }
 
 // NewServer creates a new EtcdServer from the supplied configuration. The
@@ -536,6 +540,8 @@ func (s *EtcdServer) run() {
 		s.r.stop()
 		sched.Stop()
 
+		s.wg.Wait()
+
 		// kv, lessor and backend can be nil if running without v3 enabled
 		// or running unit tests.
 		if s.lessor != nil {
@@ -1089,7 +1095,10 @@ func (s *EtcdServer) applyConfChange(cc raftpb.ConfChange, confState *raftpb.Con
 func (s *EtcdServer) snapshot(snapi uint64, confState raftpb.ConfState) {
 	clone := s.store.Clone()
 
+	s.wg.Add(1)
 	go func() {
+		defer s.wg.Done()
+
 		d, err := clone.SaveNoCopy()
 		// TODO: current store will never fail to do a snapshot
 		// what should we do if the store might fail?