Skip to content

Commit

Permalink
net: deflake TestDialTimeout{,FDLeak} in the case of TCP simultaneous…
Browse files Browse the repository at this point in the history
… open

Fixes golang#11872.

Change-Id: Ibc7d8438374c9d90fd4cbefb61426c7f4f96af0d
Reviewed-on: https://go-review.googlesource.com/12691
Reviewed-by: Russ Cox <[email protected]>
  • Loading branch information
cixtor authored and rsc committed Jul 27, 2015
1 parent 54a966e commit 68557de
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
24 changes: 20 additions & 4 deletions src/net/dial_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,24 @@ func TestDialTimeoutFDLeak(t *testing.T) {
defer sw.Set(socktest.FilterConnect, nil)
}

before := sw.Sockets()
// Avoid tracking open-close jitterbugs between netFD and
// socket that leads to confusion of information inside
// socktest.Switch.
// It may happen when the Dial call bumps against TCP
// simultaneous open. See selfConnect in tcpsock_posix.go.
defer func() {
sw.Set(socktest.FilterClose, nil)
forceCloseSockets()
}()
var mu sync.Mutex
var attempts int
sw.Set(socktest.FilterClose, func(so *socktest.Status) (socktest.AfterFilter, error) {
mu.Lock()
attempts++
mu.Unlock()
return nil, errTimedout
})

const N = 100
var wg sync.WaitGroup
wg.Add(N)
Expand All @@ -142,9 +159,8 @@ func TestDialTimeoutFDLeak(t *testing.T) {
}()
}
wg.Wait()
after := sw.Sockets()
if len(after) != len(before) {
t.Errorf("got %d; want %d", len(after), len(before))
if attempts < N {
t.Errorf("got %d; want >= %d", attempts, N)
}
}

Expand Down
13 changes: 13 additions & 0 deletions src/net/timeout_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,19 @@ func TestDialTimeout(t *testing.T) {
defer func() { testHookDialChannel = origTestHookDialChannel }()
defer sw.Set(socktest.FilterConnect, nil)

// Avoid tracking open-close jitterbugs between netFD and
// socket that leads to confusion of information inside
// socktest.Switch.
// It may happen when the Dial call bumps against TCP
// simultaneous open. See selfConnect in tcpsock_posix.go.
defer func() {
sw.Set(socktest.FilterClose, nil)
forceCloseSockets()
}()
sw.Set(socktest.FilterClose, func(so *socktest.Status) (socktest.AfterFilter, error) {
return nil, errTimedout
})

for i, tt := range dialTimeoutTests {
switch runtime.GOOS {
case "plan9", "windows":
Expand Down

0 comments on commit 68557de

Please sign in to comment.