]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: skip updateBuildID on binaries we will run
authorRuss Cox <rsc@golang.org>
Wed, 18 Oct 2017 01:48:47 +0000 (21:48 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 19 Oct 2017 15:41:09 +0000 (15:41 +0000)
On modern Unix systems it is basically impossible for a multithreaded
program to open a binary for write, close it, and then fork+exec that
same binary. So don't write the binary if we're going to fork+exec it.

This fixes the ETXTBSY flakes.

Fixes #22220.
See also #22315.

Change-Id: I6be4802fa174726ef2a93d5b2f09f708da897cdb
Reviewed-on: https://go-review.googlesource.com/71570
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/internal/work/build.go

index 50e3cc1d7dc0972bfd4d8643e257765348e54a5c..11e4632815c2aa8615c36bc7c80aa4bde0d5e85a 100644 (file)
@@ -1696,8 +1696,18 @@ func (b *Builder) build(a *Action) (err error) {
                }
        }
 
-       if err := b.updateBuildID(a, actionID, objpkg); err != nil {
-               return err
+       // Update the binary with the final build ID.
+       // But if OmitDebug is set, don't, because we set OmitDebug
+       // on binaries that we are going to run and then delete.
+       // There's no point in doing work on such a binary.
+       // Worse, opening the binary for write here makes it
+       // essentially impossible to safely fork+exec due to a fundamental
+       // incompatibility between ETXTBSY and threads on modern Unix systems.
+       // See golang.org/issue/22220.
+       if !a.Package.Internal.OmitDebug {
+               if err := b.updateBuildID(a, actionID, objpkg); err != nil {
+                       return err
+               }
        }
 
        return nil