Browse Source

Merge pull request #9178 from gyuho/error-handling

etcdserver/api/v3rpc: debug-log client disconnect on TLS, http/2 stream CANCEL
Gyuho Lee 8 years ago
parent
commit
0f1ac0cef6
2 changed files with 23 additions and 3 deletions
  1. 1 1
      .words
  2. 22 2
      etcdserver/api/v3rpc/util.go

+ 1 - 1
.words

@@ -18,6 +18,7 @@ cancelation
 cluster_proxy
 cluster_proxy
 defragment
 defragment
 defragmenting
 defragmenting
+errClientDisconnected
 etcd
 etcd
 gRPC
 gRPC
 goroutine
 goroutine
@@ -43,4 +44,3 @@ too_many_pings
 uncontended
 uncontended
 unprefixed
 unprefixed
 unlisting
 unlisting
-

+ 22 - 2
etcdserver/api/v3rpc/util.go

@@ -16,6 +16,7 @@ package v3rpc
 
 
 import (
 import (
 	"context"
 	"context"
+	"strings"
 
 
 	"github.com/coreos/etcd/auth"
 	"github.com/coreos/etcd/auth"
 	"github.com/coreos/etcd/etcdserver"
 	"github.com/coreos/etcd/etcdserver"
@@ -91,6 +92,25 @@ func isClientCtxErr(ctxErr error, err error) bool {
 	if !ok {
 	if !ok {
 		return false
 		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
 }
 }