Commit 4160a71d authored by Bryan C. Mills's avatar Bryan C. Mills

cmd/dist: fix GOROOT permissions on failure

While running various tests for #28387, I keep ending up with an
unwritable GOROOT after a failure.

While the unwritable GOROOT is a fairly exotic condition (normally
only happens on builders), it's somewhat annoying when debugging, so
I'm switching all of the log.Fatal* call sites to use the existing
fatalf function, which supports general atexit-like cleanup.

Updates #28387

Change-Id: I473cda7eacd9ad82bdeab647766373126dc7390e
Reviewed-on: https://go-review.googlesource.com/c/go/+/207341
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 9af87943
...@@ -100,11 +100,11 @@ func (t *tester) run() { ...@@ -100,11 +100,11 @@ func (t *tester) run() {
slurp, err := exec.Command("go", "env", "CGO_ENABLED").Output() slurp, err := exec.Command("go", "env", "CGO_ENABLED").Output()
if err != nil { if err != nil {
log.Fatalf("Error running go env CGO_ENABLED: %v", err) fatalf("Error running go env CGO_ENABLED: %v", err)
} }
t.cgoEnabled, _ = strconv.ParseBool(strings.TrimSpace(string(slurp))) t.cgoEnabled, _ = strconv.ParseBool(strings.TrimSpace(string(slurp)))
if flag.NArg() > 0 && t.runRxStr != "" { if flag.NArg() > 0 && t.runRxStr != "" {
log.Fatalf("the -run regular expression flag is mutually exclusive with test name arguments") fatalf("the -run regular expression flag is mutually exclusive with test name arguments")
} }
t.runNames = flag.Args() t.runNames = flag.Args()
...@@ -154,7 +154,7 @@ func (t *tester) run() { ...@@ -154,7 +154,7 @@ func (t *tester) run() {
if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" { if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" {
t.timeoutScale, err = strconv.Atoi(s) t.timeoutScale, err = strconv.Atoi(s)
if err != nil { if err != nil {
log.Fatalf("failed to parse $GO_TEST_TIMEOUT_SCALE = %q as integer: %v", s, err) fatalf("failed to parse $GO_TEST_TIMEOUT_SCALE = %q as integer: %v", s, err)
} }
} }
...@@ -187,18 +187,17 @@ func (t *tester) run() { ...@@ -187,18 +187,17 @@ func (t *tester) run() {
for _, name := range t.runNames { for _, name := range t.runNames {
if !t.isRegisteredTestName(name) { if !t.isRegisteredTestName(name) {
log.Fatalf("unknown test %q", name) fatalf("unknown test %q", name)
} }
} }
// On a few builders, make GOROOT unwritable to catch tests writing to it. // On a few builders, make GOROOT unwritable to catch tests writing to it.
restoreGOROOT := func() {}
if strings.HasPrefix(os.Getenv("GO_BUILDER_NAME"), "linux-") { if strings.HasPrefix(os.Getenv("GO_BUILDER_NAME"), "linux-") {
if os.Getuid() == 0 { if os.Getuid() == 0 {
// Don't bother making GOROOT unwritable: // Don't bother making GOROOT unwritable:
// we're running as root, so permissions would have no effect. // we're running as root, so permissions would have no effect.
} else { } else {
restoreGOROOT = t.makeGOROOTUnwritable() xatexit(t.makeGOROOTUnwritable())
} }
} }
...@@ -214,21 +213,19 @@ func (t *tester) run() { ...@@ -214,21 +213,19 @@ func (t *tester) run() {
if t.keepGoing { if t.keepGoing {
log.Printf("Failed: %v", err) log.Printf("Failed: %v", err)
} else { } else {
restoreGOROOT() fatalf("Failed: %v", err)
log.Fatalf("Failed: %v", err)
} }
} }
} }
t.runPending(nil) t.runPending(nil)
restoreGOROOT()
timelog("end", "dist test") timelog("end", "dist test")
if t.failed { if t.failed {
fmt.Println("\nFAILED") fmt.Println("\nFAILED")
os.Exit(1) xexit(1)
} else if incomplete[goos+"/"+goarch] { } else if incomplete[goos+"/"+goarch] {
fmt.Println("\nFAILED (incomplete port)") fmt.Println("\nFAILED (incomplete port)")
os.Exit(1) xexit(1)
} else if t.partial { } else if t.partial {
fmt.Println("\nALL TESTS PASSED (some were excluded)") fmt.Println("\nALL TESTS PASSED (some were excluded)")
} else { } else {
...@@ -262,7 +259,7 @@ func short() string { ...@@ -262,7 +259,7 @@ func short() string {
if v := os.Getenv("GO_TEST_SHORT"); v != "" { if v := os.Getenv("GO_TEST_SHORT"); v != "" {
short, err := strconv.ParseBool(v) short, err := strconv.ParseBool(v)
if err != nil { if err != nil {
log.Fatalf("invalid GO_TEST_SHORT %q: %v", v, err) fatalf("invalid GO_TEST_SHORT %q: %v", v, err)
} }
if !short { if !short {
return "-short=false" return "-short=false"
...@@ -433,7 +430,7 @@ func (t *tester) registerTests() { ...@@ -433,7 +430,7 @@ func (t *tester) registerTests() {
cmd.Stderr = new(bytes.Buffer) cmd.Stderr = new(bytes.Buffer)
all, err := cmd.Output() all, err := cmd.Output()
if err != nil { if err != nil {
log.Fatalf("Error running go list std cmd: %v:\n%s", err, cmd.Stderr) fatalf("Error running go list std cmd: %v:\n%s", err, cmd.Stderr)
} }
pkgs := strings.Fields(string(all)) pkgs := strings.Fields(string(all))
for _, pkg := range pkgs { for _, pkg := range pkgs {
...@@ -545,7 +542,7 @@ func (t *tester) registerTests() { ...@@ -545,7 +542,7 @@ func (t *tester) registerTests() {
err := cmd.Run() err := cmd.Run()
if rerr := os.Rename(moved, goroot); rerr != nil { if rerr := os.Rename(moved, goroot); rerr != nil {
log.Fatalf("failed to restore GOROOT: %v", rerr) fatalf("failed to restore GOROOT: %v", rerr)
} }
return err return err
}, },
...@@ -995,7 +992,7 @@ func (t *tester) supportedBuildmode(mode string) bool { ...@@ -995,7 +992,7 @@ func (t *tester) supportedBuildmode(mode string) bool {
return false return false
default: default:
log.Fatalf("internal error: unknown buildmode %s", mode) fatalf("internal error: unknown buildmode %s", mode)
return false return false
} }
} }
...@@ -1190,7 +1187,7 @@ func (t *tester) runPending(nextTest *distTest) { ...@@ -1190,7 +1187,7 @@ func (t *tester) runPending(nextTest *distTest) {
checkNotStale("go", "std") checkNotStale("go", "std")
} }
if t.failed && !t.keepGoing { if t.failed && !t.keepGoing {
log.Fatal("FAILED") fatalf("FAILED")
} }
if dt := nextTest; dt != nil { if dt := nextTest; dt != nil {
...@@ -1468,7 +1465,7 @@ func (t *tester) makeGOROOTUnwritable() (undo func()) { ...@@ -1468,7 +1465,7 @@ func (t *tester) makeGOROOTUnwritable() (undo func()) {
if err != nil { if err != nil {
dirs = dirs[i:] // Only undo what we did so far. dirs = dirs[i:] // Only undo what we did so far.
undo() undo()
log.Fatalf("failed to make GOROOT read-only: %v", err) fatalf("failed to make GOROOT read-only: %v", err)
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment