]> Cypherpunks repositories - gostls13.git/commitdiff
os/exec: constrain thread usage in leaked descriptor test on illumos
authorJoshua M. Clulow <josh@sysmgr.org>
Mon, 30 Nov 2020 01:18:51 +0000 (17:18 -0800)
committerIan Lance Taylor <iant@golang.org>
Mon, 30 Nov 2020 03:18:36 +0000 (03:18 +0000)
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>

src/os/exec/exec_test.go

index cd3d759ebcc0792fa0d847c9cca09d93911db25d..fc49b8a3321f28d4a39d8e527d38aeeb747d106c 100644 (file)
@@ -691,6 +691,18 @@ func TestExtraFiles(t *testing.T) {
        c.Stdout = &stdout
        c.Stderr = &stderr
        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()
        if err != nil {
                t.Fatalf("Run: %v\n--- stdout:\n%s--- stderr:\n%s", err, stdout.Bytes(), stderr.Bytes())