Browse Source

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 năm trước cách đây
mục cha
commit
7f95780bfb
3 tập tin đã thay đổi với 4 bổ sung3 xóa
  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{}{}