Pārlūkot izejas kodu

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.
Yicheng Qin 10 gadi atpakaļ
vecāks
revīzija
7f95780bfb
3 mainītis faili ar 4 papildinājumiem un 3 dzēšanām
  1. 0 3
      etcdserver/raft.go
  2. 2 0
      etcdserver/raft_test.go
  3. 2 0
      etcdserver/server.go

+ 0 - 3
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()

+ 2 - 0
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()

+ 2 - 0
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{}{}