From 4b50c66459cb0fc02c243e8f28e2320856c7f288 Mon Sep 17 00:00:00 2001 From: "Sahdev P. Zala" Date: Sun, 7 Jan 2018 16:24:45 -0500 Subject: [PATCH] Log: debug user cancellation and log warning for rest The context error with cancel code is typically for user cancellation which should be at debug level. For other error codes we should display a warning. Fixes #9085 --- etcdserver/api/v3rpc/lease.go | 4 ++-- etcdserver/api/v3rpc/util.go | 5 ++++- etcdserver/api/v3rpc/watch.go | 8 ++++---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/etcdserver/api/v3rpc/lease.go b/etcdserver/api/v3rpc/lease.go index 9779d903aa86..5b4f2b142281 100644 --- a/etcdserver/api/v3rpc/lease.go +++ b/etcdserver/api/v3rpc/lease.go @@ -107,7 +107,7 @@ func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro return nil } if err != nil { - if isClientCtxErr(err) { + if isClientCtxErr(stream.Context().Err(), err) { plog.Debugf("failed to receive lease keepalive request from gRPC stream (%q)", err.Error()) } else { plog.Warningf("failed to receive lease keepalive request from gRPC stream (%q)", err.Error()) @@ -137,7 +137,7 @@ func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro resp.TTL = ttl err = stream.Send(resp) if err != nil { - if isClientCtxErr(err) { + if isClientCtxErr(stream.Context().Err(), err) { plog.Debugf("failed to send lease keepalive response to gRPC stream (%q)", err.Error()) } else { plog.Warningf("failed to send lease keepalive response to gRPC stream (%q)", err.Error()) diff --git a/etcdserver/api/v3rpc/util.go b/etcdserver/api/v3rpc/util.go index bcf8744c73ea..ec34249c1eb5 100644 --- a/etcdserver/api/v3rpc/util.go +++ b/etcdserver/api/v3rpc/util.go @@ -82,7 +82,10 @@ func togRPCError(err error) error { return grpcErr } -func isClientCtxErr(err error) bool { +func isClientCtxErr(ctxErr error, err error) bool { + if ctxErr != nil { + return ctxErr == context.Canceled || ctxErr == context.DeadlineExceeded + } ev, _ := status.FromError(err) code := ev.Code() return code == codes.Canceled || code == codes.DeadlineExceeded diff --git a/etcdserver/api/v3rpc/watch.go b/etcdserver/api/v3rpc/watch.go index c9a4cff67a9b..dd4f329515d1 100644 --- a/etcdserver/api/v3rpc/watch.go +++ b/etcdserver/api/v3rpc/watch.go @@ -140,7 +140,7 @@ func (ws *watchServer) Watch(stream pb.Watch_WatchServer) (err error) { // deadlock when calling sws.close(). go func() { if rerr := sws.recvLoop(); rerr != nil { - if isClientCtxErr(rerr) { + if isClientCtxErr(stream.Context().Err(), rerr) { plog.Debugf("failed to receive watch request from gRPC stream (%q)", rerr.Error()) } else { plog.Warningf("failed to receive watch request from gRPC stream (%q)", rerr.Error()) @@ -343,7 +343,7 @@ func (sws *serverWatchStream) sendLoop() { mvcc.ReportEventReceived(len(evs)) if err := sws.gRPCStream.Send(wr); err != nil { - if isClientCtxErr(err) { + if isClientCtxErr(sws.gRPCStream.Context().Err(), err) { plog.Debugf("failed to send watch response to gRPC stream (%q)", err.Error()) } else { plog.Warningf("failed to send watch response to gRPC stream (%q)", err.Error()) @@ -364,7 +364,7 @@ func (sws *serverWatchStream) sendLoop() { } if err := sws.gRPCStream.Send(c); err != nil { - if isClientCtxErr(err) { + if isClientCtxErr(sws.gRPCStream.Context().Err(), err) { plog.Debugf("failed to send watch control response to gRPC stream (%q)", err.Error()) } else { plog.Warningf("failed to send watch control response to gRPC stream (%q)", err.Error()) @@ -384,7 +384,7 @@ func (sws *serverWatchStream) sendLoop() { for _, v := range pending[wid] { mvcc.ReportEventReceived(len(v.Events)) if err := sws.gRPCStream.Send(v); err != nil { - if isClientCtxErr(err) { + if isClientCtxErr(sws.gRPCStream.Context().Err(), err) { plog.Debugf("failed to send pending watch response to gRPC stream (%q)", err.Error()) } else { plog.Warningf("failed to send pending watch response to gRPC stream (%q)", err.Error())