Skip to content

Commit 0f1ac0c

Browse files
authored
Merge pull request #9178 from gyuho/error-handling
etcdserver/api/v3rpc: debug-log client disconnect on TLS, http/2 stream CANCEL
2 parents 7f68327 + 0cf9382 commit 0f1ac0c

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

.words

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ cancelation
1818
cluster_proxy
1919
defragment
2020
defragmenting
21+
errClientDisconnected
2122
etcd
2223
gRPC
2324
goroutine
@@ -43,4 +44,3 @@ too_many_pings
4344
uncontended
4445
unprefixed
4546
unlisting
46-

etcdserver/api/v3rpc/util.go

+22-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package v3rpc
1616

1717
import (
1818
"context"
19+
"strings"
1920

2021
"github.com/coreos/etcd/auth"
2122
"github.com/coreos/etcd/etcdserver"
@@ -91,6 +92,25 @@ func isClientCtxErr(ctxErr error, err error) bool {
9192
if !ok {
9293
return false
9394
}
94-
code := ev.Code()
95-
return code == codes.Canceled || code == codes.DeadlineExceeded
95+
96+
switch ev.Code() {
97+
case codes.Canceled, codes.DeadlineExceeded:
98+
// client-side context cancel or deadline exceeded
99+
// "rpc error: code = Canceled desc = context canceled"
100+
// "rpc error: code = DeadlineExceeded desc = context deadline exceeded"
101+
return true
102+
case codes.Unavailable:
103+
msg := ev.Message()
104+
// client-side context cancel or deadline exceeded with TLS ("http2.errClientDisconnected")
105+
// "rpc error: code = Unavailable desc = client disconnected"
106+
if msg == "client disconnected" {
107+
return true
108+
}
109+
// "grpc/transport.ClientTransport.CloseStream" on canceled streams
110+
// "rpc error: code = Unavailable desc = stream error: stream ID 21; CANCEL")
111+
if strings.HasPrefix(msg, "stream error: ") && strings.HasSuffix(msg, "; CANCEL") {
112+
return true
113+
}
114+
}
115+
return false
96116
}

0 commit comments

Comments
 (0)