فهرست منبع

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 سال پیش
والد
کامیت
7f95780bfb
3فایلهای تغییر یافته به همراه4 افزوده شده و 3 حذف شده
  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{}{}