Explorar el Código

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 hace 10 años
padre
commit
7f95780bfb
Se han modificado 3 ficheros con 4 adiciones y 3 borrados
  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{}{}