From d0eff45256b2760ef85cd86e948a1e36c521e2ae Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Fri, 19 Jan 2018 12:23:10 -0800 Subject: [PATCH 1/2] etcdserver/api/v3rpc: debug-log client disconnect on TLS, http/2 stream CANCEL Signed-off-by: Gyuho Lee --- etcdserver/api/v3rpc/util.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/etcdserver/api/v3rpc/util.go b/etcdserver/api/v3rpc/util.go index e4bb85ae7..328135b1e 100644 --- a/etcdserver/api/v3rpc/util.go +++ b/etcdserver/api/v3rpc/util.go @@ -16,6 +16,7 @@ package v3rpc import ( "context" + "strings" "github.com/coreos/etcd/auth" "github.com/coreos/etcd/etcdserver" @@ -91,6 +92,25 @@ func isClientCtxErr(ctxErr error, err error) bool { if !ok { return false } - code := ev.Code() - return code == codes.Canceled || code == codes.DeadlineExceeded + + switch ev.Code() { + case codes.Canceled, codes.DeadlineExceeded: + // client-side context cancel or deadline exceeded + // "rpc error: code = Canceled desc = context canceled" + // "rpc error: code = DeadlineExceeded desc = context deadline exceeded" + return true + case codes.Unavailable: + msg := ev.Message() + // client-side context cancel or deadline exceeded with TLS ("http2.errClientDisconnected") + // "rpc error: code = Unavailable desc = client disconnected" + if msg == "client disconnected" { + return true + } + // "grpc/transport.ClientTransport.CloseStream" on canceled streams + // "rpc error: code = Unavailable desc = stream error: stream ID 21; CANCEL") + if strings.HasPrefix(msg, "stream error: ") && strings.HasSuffix(msg, "; CANCEL") { + return true + } + } + return false } From 0cf9382024da6132cb5f0778c3fb43e4a6c88afd Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Fri, 19 Jan 2018 12:25:25 -0800 Subject: [PATCH 2/2] words: whitelist "errClientDisconnected" Signed-off-by: Gyuho Lee --- .words | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.words b/.words index abdf36e7e..0098377ea 100644 --- a/.words +++ b/.words @@ -18,6 +18,7 @@ cancelation cluster_proxy defragment defragmenting +errClientDisconnected etcd gRPC goroutine @@ -43,4 +44,3 @@ too_many_pings uncontended unprefixed unlisting -