From 4991cda20297860a58b8fda34062e2d16e767c62 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Thu, 21 Apr 2016 08:48:11 -0700 Subject: [PATCH] etcdsever: fix the leaky snashot routine issue --- etcdserver/server.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/etcdserver/server.go b/etcdserver/server.go index 6874405c6..0b446e4f4 100644 --- a/etcdserver/server.go +++ b/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?