]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/dist: log CPU model when testing
authorMichael Pratt <mpratt@google.com>
Mon, 13 Dec 2021 22:32:07 +0000 (17:32 -0500)
committerMichael Pratt <mpratt@google.com>
Fri, 14 Jan 2022 18:36:41 +0000 (18:36 +0000)
Knowing whether test failures are correlated with specific CPU models on
has proven useful on several issues. Log it for prior to testing so it
is always available.

internal/sysinfo provides the CPU model, but it is not available in the
bootstrap toolchain, so we can't access this unconditionally in
cmd/dist. Instead use a build-tagged file, as the final version of
cmd/dist will use the final toolchain.

The addition of new data to the beginning of cmd/dist output will break
x/build/cmd/coordinator's banner parsing, leaving extra lines in the log
output, though information will not be lost.
https://golang.org/cl/372538 fixes up the coordinator and should be
submitted and deployed before this CL is submitted.

For #46272.
For #49209.
For #50146.

Change-Id: I515d2ec58e4c0034b76bf624ecaab38f16146074
Reviewed-on: https://go-review.googlesource.com/c/go/+/371474
Trust: Benny Siegert <bsiegert@gmail.com>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Trust: Michael Pratt <mpratt@google.com>
Run-TryBot: Michael Pratt <mpratt@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/dist/metadata.go [new file with mode: 0644]
src/cmd/dist/metadata_bootstrap.go [new file with mode: 0644]
src/cmd/dist/sys_windows.go
src/cmd/dist/test.go

diff --git a/src/cmd/dist/metadata.go b/src/cmd/dist/metadata.go
new file mode 100644 (file)
index 0000000..f0a125f
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Helper to print system metadata (CPU model, etc). This uses packages that
+// may not be available in the bootstrap toolchain. It only needs to be built
+// on the dist build using the final toolchain.
+
+//go:build go1.18
+// +build go1.18
+
+package main
+
+import (
+       "fmt"
+       "internal/sysinfo"
+       "runtime"
+)
+
+func logMetadata() error {
+       fmt.Printf("# GOARCH: %s\n", runtime.GOARCH)
+       fmt.Printf("# CPU: %s\n", sysinfo.CPU.Name())
+       return nil
+}
diff --git a/src/cmd/dist/metadata_bootstrap.go b/src/cmd/dist/metadata_bootstrap.go
new file mode 100644 (file)
index 0000000..fe5f422
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// No-op metadata implementation when building with an old bootstrap toolchain.
+
+//go:build !go1.18
+// +build !go1.18
+
+package main
+
+import (
+       "fmt"
+)
+
+func logMetadata() error {
+       // We don't return an error so we don't completely preclude running
+       // tests with a bootstrap dist.
+       fmt.Printf("# Metadata unavailable: bootstrap build\n")
+       return nil
+}
index 265f729d0fc345611f27e25037a955f9bc1fca17..0fb66ad27dba305309987867340854ce0a2ef059 100644 (file)
@@ -38,11 +38,11 @@ const (
        PROCESSOR_ARCHITECTURE_IA64  = 6
 )
 
-var sysinfo systeminfo
+var winsysinfo systeminfo
 
 func sysinit() {
-       syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0)
-       switch sysinfo.wProcessorArchitecture {
+       syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&winsysinfo)), 0, 0)
+       switch winsysinfo.wProcessorArchitecture {
        case PROCESSOR_ARCHITECTURE_AMD64:
                gohostarch = "amd64"
        case PROCESSOR_ARCHITECTURE_INTEL:
index 50a2e5936c639846d8d9f78f78756552fcf10390..fed83120ed2d55b79ab597eb00b3beb20d650ed0 100644 (file)
@@ -218,6 +218,15 @@ func (t *tester) run() {
                }
        }
 
+       if err := t.maybeLogMetadata(); err != nil {
+               t.failed = true
+               if t.keepGoing {
+                       log.Printf("Failed logging metadata: %v", err)
+               } else {
+                       fatalf("Failed logging metadata: %v", err)
+               }
+       }
+
        for _, dt := range t.tests {
                if !t.shouldRunTest(dt.name) {
                        t.partial = true
@@ -268,6 +277,16 @@ func (t *tester) shouldRunTest(name string) bool {
        return false
 }
 
+func (t *tester) maybeLogMetadata() error {
+       if t.compileOnly {
+               // We need to run a subprocess to log metadata. Don't do that
+               // on compile-only runs.
+               return nil
+       }
+       t.out("Test execution environment.")
+       return logMetadata()
+}
+
 // short returns a -short flag value to use with 'go test'
 // or a test binary for tests intended to run in short mode.
 // It returns "true", unless the environment variable