From fad2c09fa8de197a350ae77967544fd7b05f655d Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Thu, 7 May 2015 17:51:45 -0700 Subject: [PATCH] rafthttp: not log expected timeout as error The network timeout from stream with etcd 2.0 is expected because etcd 2.0 doesn't heartbeat on idle connections. --- rafthttp/stream.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/rafthttp/stream.go b/rafthttp/stream.go index c5755d1a1..d5b377c55 100644 --- a/rafthttp/stream.go +++ b/rafthttp/stream.go @@ -282,7 +282,15 @@ func (cr *streamReader) run() { } } else { err := cr.decodeLoop(rc, t) - if err != io.EOF && !isClosedConnectionError(err) { + switch { + // all data is read out + case err == io.EOF: + // connection is closed by the remote + case isClosedConnectionError(err): + // stream msgapp is only used for etcd 2.0, and etcd 2.0 doesn't + // heartbeat on the idle stream, so it is expected to time out. + case t == streamTypeMsgApp && isNetworkTimeoutError(err): + default: log.Printf("rafthttp: failed to read message on stream %s due to %v", t, err) } } @@ -481,3 +489,8 @@ func checkStreamSupport(v *semver.Version, t streamType) bool { } return false } + +func isNetworkTimeoutError(err error) bool { + nerr, ok := err.(net.Error) + return ok && nerr.Timeout() +}