From 8ce579aac9a89aafc7ff56a71c83c9db6aebb57e Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Thu, 13 Apr 2017 10:48:06 -0700 Subject: [PATCH] pkg/transport: add 'IsClosedConnError' Signed-off-by: Gyu-Ho Lee --- pkg/transport/listener.go | 10 ++++++++++ pkg/transport/listener_test.go | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/pkg/transport/listener.go b/pkg/transport/listener.go index 88c8923b8..3e45a8446 100644 --- a/pkg/transport/listener.go +++ b/pkg/transport/listener.go @@ -27,6 +27,7 @@ import ( "net" "os" "path/filepath" + "strings" "time" "github.com/coreos/etcd/pkg/tlsutil" @@ -269,3 +270,12 @@ func ShallowCopyTLSConfig(cfg *tls.Config) *tls.Config { } return &ncfg } + +// IsClosedConnError returns true if the error is from closing listener, cmux. +// copied from golang.org/x/net/http2/http2.go +func IsClosedConnError(err error) bool { + // 'use of closed network connection' (Go <=1.8) + // 'use of closed file or network connection' (Go >1.8, internal/poll.ErrClosing) + // 'mux: listener closed' (cmux.ErrListenerClosed) + return err != nil && strings.Contains(err.Error(), "closed") +} diff --git a/pkg/transport/listener_test.go b/pkg/transport/listener_test.go index d5ff31789..b3217333a 100644 --- a/pkg/transport/listener_test.go +++ b/pkg/transport/listener_test.go @@ -274,3 +274,15 @@ func TestNewListenerTLSInfoSelfCert(t *testing.T) { } testNewListenerTLSInfoAccept(t, tlsinfo) } + +func TestIsClosedConnError(t *testing.T) { + l, err := NewListener("testsocket", "unix", nil) + if err != nil { + t.Errorf("error listening on unix socket (%v)", err) + } + l.Close() + _, err = l.Accept() + if !IsClosedConnError(err) { + t.Fatalf("expect true, got false (%v)", err) + } +}