Browse Source

etcdserver: time out when readStateC is blocking

Otherwise, it will block forever when the server is overloaded.

Fix https://github.com/coreos/etcd/issues/6891.
Gyu-Ho Lee 9 years ago
parent
commit
3fd1d951f8
1 changed files with 3 additions and 0 deletions
  1. 3 0
      etcdserver/raft.go

+ 3 - 0
etcdserver/raft.go

@@ -135,6 +135,7 @@ func (r *raftNode) start(rh *raftReadyHandler) {
 	r.applyc = make(chan apply)
 	r.applyc = make(chan apply)
 	r.stopped = make(chan struct{})
 	r.stopped = make(chan struct{})
 	r.done = make(chan struct{})
 	r.done = make(chan struct{})
+	internalTimeout := time.Second
 
 
 	go func() {
 	go func() {
 		defer r.onStop()
 		defer r.onStop()
@@ -167,6 +168,8 @@ func (r *raftNode) start(rh *raftReadyHandler) {
 				if len(rd.ReadStates) != 0 {
 				if len(rd.ReadStates) != 0 {
 					select {
 					select {
 					case r.readStateC <- rd.ReadStates[len(rd.ReadStates)-1]:
 					case r.readStateC <- rd.ReadStates[len(rd.ReadStates)-1]:
+					case <-time.After(internalTimeout):
+						plog.Warningf("timed out sending read state")
 					case <-r.stopped:
 					case <-r.stopped:
 						return
 						return
 					}
 					}