diff options
author | Bryan C. Mills <bcmills@google.com> | 2021-12-09 17:00:51 -0500 |
---|---|---|
committer | Bryan Mills <bcmills@google.com> | 2021-12-13 15:47:14 +0000 |
commit | 36db10f3cb916a1b97af3bfd4be7e3a2932185f8 (patch) | |
tree | 9d5fc7f6c1481279e360112ac57ace7d1f80b37f /src/net | |
parent | 9bfe09d78bd1b3ab97bc6e1c31395f0822875fba (diff) | |
download | go-36db10f3cb916a1b97af3bfd4be7e3a2932185f8.tar.gz go-36db10f3cb916a1b97af3bfd4be7e3a2932185f8.zip |
net: remove erroneous Dial check in TestListenerClose
TestListenerClose had been asserting that a Dial to the newly-closed
address always fails, on the assumption that the listener's address
and port would not be reused by some other listener that could then
accept the connection.
As far as I can tell, that assumption is not valid: the Dial after
Close may well connect to a Listener opened for some other test, or
even one opened by a completely different process running concurrently
on the same machine.
Fixes #38700
Change-Id: I925ed1b2ccb556135a2c5be0240d1789ed27d5fc
Reviewed-on: https://go-review.googlesource.com/c/go/+/370666
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/net')
-rw-r--r-- | src/net/net_test.go | 29 |
1 files changed, 6 insertions, 23 deletions
diff --git a/src/net/net_test.go b/src/net/net_test.go index 35acac509b..5d9c3c67e6 100644 --- a/src/net/net_test.go +++ b/src/net/net_test.go @@ -243,7 +243,6 @@ func TestListenerClose(t *testing.T) { defer os.Remove(ln.Addr().String()) } - dst := ln.Addr().String() if err := ln.Close(); err != nil { if perr := parseCloseError(err, false); perr != nil { t.Error(perr) @@ -256,28 +255,12 @@ func TestListenerClose(t *testing.T) { t.Fatal("should fail") } - if network == "tcp" { - // We will have two TCP FSMs inside the - // kernel here. There's no guarantee that a - // signal comes from the far end FSM will be - // delivered immediately to the near end FSM, - // especially on the platforms that allow - // multiple consumer threads to pull pending - // established connections at the same time by - // enabling SO_REUSEPORT option such as Linux, - // DragonFly BSD. So we need to give some time - // quantum to the kernel. - // - // Note that net.inet.tcp.reuseport_ext=1 by - // default on DragonFly BSD. - time.Sleep(time.Millisecond) - - cc, err := Dial("tcp", dst) - if err == nil { - t.Error("Dial to closed TCP listener succeeded.") - cc.Close() - } - } + // Note: we cannot ensure that a subsequent Dial does not succeed, because + // we do not in general have any guarantee that ln.Addr is not immediately + // reused. (TCP sockets enter a TIME_WAIT state when closed, but that only + // applies to existing connections for the port — it does not prevent the + // port itself from being used for entirely new connections in the + // meantime.) }) } } |