From 3fd1d951f88ac1131f7c94352971db2ccb825058 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 5 Dec 2016 15:34:46 -0800 Subject: [PATCH] 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. --- etcdserver/raft.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/etcdserver/raft.go b/etcdserver/raft.go index 6d6afdb94..50b574211 100644 --- a/etcdserver/raft.go +++ b/etcdserver/raft.go @@ -135,6 +135,7 @@ func (r *raftNode) start(rh *raftReadyHandler) { r.applyc = make(chan apply) r.stopped = make(chan struct{}) r.done = make(chan struct{}) + internalTimeout := time.Second go func() { defer r.onStop() @@ -167,6 +168,8 @@ func (r *raftNode) start(rh *raftReadyHandler) { if len(rd.ReadStates) != 0 { select { case r.readStateC <- rd.ReadStates[len(rd.ReadStates)-1]: + case <-time.After(internalTimeout): + plog.Warningf("timed out sending read state") case <-r.stopped: return }