From 71d127aafd15d7d11afb7752c22689a8c13ef21a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 21 Oct 2019 14:12:26 -0400 Subject: [PATCH] crypto/tls: retry net.Dial flakes on Dragonfly localPipe currently flakes in various crypto/tls tests. Since that function doesn't seem to flake anywhere else, I suspect a kernel bug. To make the test less flaky, retry the Dial if we suspect that it is affected. (Worst case, we delay the test by a few seconds before erroring out as usual.) Fixes #29583 Change-Id: I357990ffa316edb471bd7d46d6404fa0884da646 Reviewed-on: https://go-review.googlesource.com/c/go/+/202557 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/crypto/tls/handshake_test.go | 15 +++++++++++++-- src/crypto/tls/handshake_unix_test.go | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/crypto/tls/handshake_unix_test.go diff --git a/src/crypto/tls/handshake_test.go b/src/crypto/tls/handshake_test.go index 6081ab20f0..01c234e606 100644 --- a/src/crypto/tls/handshake_test.go +++ b/src/crypto/tls/handshake_test.go @@ -17,6 +17,7 @@ import ( "net" "os" "os/exec" + "runtime" "strconv" "strings" "sync" @@ -243,19 +244,29 @@ func localServer(l net.Listener) { } } +var isConnRefused = func(err error) bool { return false } + func localPipe(t testing.TB) (net.Conn, net.Conn) { localListener.mu.Lock() defer localListener.mu.Unlock() addr := localListener.addr + var err error Dialing: // We expect a rare mismatch, but probably not 5 in a row. for i := 0; i < 5; i++ { tooSlow := time.NewTimer(1 * time.Second) defer tooSlow.Stop() - c1, err := net.Dial(addr.Network(), addr.String()) + var c1 net.Conn + c1, err = net.Dial(addr.Network(), addr.String()) if err != nil { + if runtime.GOOS == "dragonfly" && isConnRefused(err) { + // golang.org/issue/29583: Dragonfly sometimes returned a spurious + // ECONNREFUSED. + <-tooSlow.C + continue + } t.Fatalf("localPipe: %v", err) } if localFlakes == 2 && i == 0 { @@ -279,7 +290,7 @@ Dialing: } } - t.Fatalf("localPipe: failed to connect") + t.Fatalf("localPipe: failed to connect: %v", err) panic("unreachable") } diff --git a/src/crypto/tls/handshake_unix_test.go b/src/crypto/tls/handshake_unix_test.go new file mode 100644 index 0000000000..72718544ae --- /dev/null +++ b/src/crypto/tls/handshake_unix_test.go @@ -0,0 +1,18 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package tls + +import ( + "errors" + "syscall" +) + +func init() { + isConnRefused = func(err error) bool { + return errors.Is(err, syscall.ECONNREFUSED) + } +} -- 2.48.1