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())