From d790ea3ef1152cd8aded824ffca50a8c56577469 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 17 Oct 2017 21:48:47 -0400 Subject: [PATCH] cmd/go: skip updateBuildID on binaries we will run 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/build.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 50e3cc1d7d..11e4632815 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -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