From 7f95780bfb5d72c651e870d0cc65c6f2b88700d8 Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Mon, 29 Jun 2015 15:34:15 -0700 Subject: [PATCH] etcdserver: init raft internal var early Its `stopped`/`done` should be created always before being used in defer in server loop. It fixes the race detected when running TestSyncTrigger. --- etcdserver/raft.go | 3 --- etcdserver/raft_test.go | 2 ++ etcdserver/server.go | 2 ++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/etcdserver/raft.go b/etcdserver/raft.go index 139891e4d..f6d2da30d 100644 --- a/etcdserver/raft.go +++ b/etcdserver/raft.go @@ -109,9 +109,6 @@ type raftNode struct { } func (r *raftNode) run() { - r.stopped = make(chan struct{}) - r.done = make(chan struct{}) - var syncC <-chan time.Time defer r.stop() diff --git a/etcdserver/raft_test.go b/etcdserver/raft_test.go index d102771a0..989db37bf 100644 --- a/etcdserver/raft_test.go +++ b/etcdserver/raft_test.go @@ -152,6 +152,8 @@ func TestStopRaftWhenWaitingForApplyDone(t *testing.T) { storage: &storageRecorder{}, raftStorage: raft.NewMemoryStorage(), transport: &nopTransporter{}, + stopped: make(chan struct{}), + done: make(chan struct{}), } r.s = &EtcdServer{r: r} go r.run() diff --git a/etcdserver/server.go b/etcdserver/server.go index 5a207530a..149f65724 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -416,6 +416,8 @@ func (s *EtcdServer) run() { // TODO: get rid of the raft initialization in etcd server s.r.s = s s.r.applyc = make(chan apply) + s.r.stopped = make(chan struct{}) + s.r.done = make(chan struct{}) go s.r.run() defer func() { s.r.stopped <- struct{}{}