mirror of https://github.com/golang/go.git
os/exec: constrain thread usage in leaked descriptor test on illumos
On illumos systems, libc can under some conditions make use of files from /proc. In the case of this test, the creation of new threads was (in the target thread) causing libc to open and close "/proc/self/lwp/5/lwpname" to set the thread name, which raced with the leaking descriptor check (see detailed analysis in #42431). This change requests that the Go runtime use less threads in the child process used to check for leaked descriptors, without just disabling the test. After a thousand repeated trials, the test no longer fails on illumos. Fixes #42431. Change-Id: Iefda26134fc91f7cb205754676e9845d9b7205cc Reviewed-on: https://go-review.googlesource.com/c/go/+/273966 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Trust: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
4ce0a7cea6
commit
e5da18df52
|
|
@ -691,6 +691,18 @@ func TestExtraFiles(t *testing.T) {
|
||||||
c.Stdout = &stdout
|
c.Stdout = &stdout
|
||||||
c.Stderr = &stderr
|
c.Stderr = &stderr
|
||||||
c.ExtraFiles = []*os.File{tf}
|
c.ExtraFiles = []*os.File{tf}
|
||||||
|
if runtime.GOOS == "illumos" {
|
||||||
|
// Some facilities in illumos are implemented via access
|
||||||
|
// to /proc by libc; such accesses can briefly occupy a
|
||||||
|
// low-numbered fd. If this occurs concurrently with the
|
||||||
|
// test that checks for leaked descriptors, the check can
|
||||||
|
// become confused and report a spurious leaked descriptor.
|
||||||
|
// (See issue #42431 for more detailed analysis.)
|
||||||
|
//
|
||||||
|
// Attempt to constrain the use of additional threads in the
|
||||||
|
// child process to make this test less flaky:
|
||||||
|
c.Env = append(os.Environ(), "GOMAXPROCS=1")
|
||||||
|
}
|
||||||
err = c.Run()
|
err = c.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Run: %v\n--- stdout:\n%s--- stderr:\n%s", err, stdout.Bytes(), stderr.Bytes())
|
t.Fatalf("Run: %v\n--- stdout:\n%s--- stderr:\n%s", err, stdout.Bytes(), stderr.Bytes())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue