aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/go/internal/modload/buildlist.go
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2021-04-30 01:29:57 -0400
committerBryan C. Mills <bcmills@google.com>2021-04-30 18:14:29 +0000
commitcbff713e68a1378713f1692cbfe13499106de7eb (patch)
tree9d99af5ffe196174e71dbb2ca366ab16406e11be /src/cmd/go/internal/modload/buildlist.go
parenteb71887b99fa656ed627c9c1d41319b9198979c8 (diff)
downloadgo-cbff713e68a1378713f1692cbfe13499106de7eb.tar.gz
go-cbff713e68a1378713f1692cbfe13499106de7eb.zip
cmd/go: add GODEBUG tokens for debugging lazy module loading
GODEBUG=lazymod=log causes the go command to log a stack dump whenever the full module graph is loaded in a lazy module. GODEBUG=lazymod=strict does the same, but also terminates the command with a nonzero exit code. For #36460 Change-Id: Ia5a4c46069044bcc157b285f64c2392990d70bd0 Reviewed-on: https://go-review.googlesource.com/c/go/+/315411 Trust: Bryan C. Mills <bcmills@google.com> Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Matloob <matloob@golang.org>
Diffstat (limited to 'src/cmd/go/internal/modload/buildlist.go')
-rw-r--r--src/cmd/go/internal/modload/buildlist.go19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go
index e7af892996..7820fcf6f1 100644
--- a/src/cmd/go/internal/modload/buildlist.go
+++ b/src/cmd/go/internal/modload/buildlist.go
@@ -11,8 +11,10 @@ import (
"cmd/go/internal/par"
"context"
"fmt"
+ "os"
"reflect"
"runtime"
+ "runtime/debug"
"strings"
"sync"
"sync/atomic"
@@ -232,12 +234,29 @@ type summaryError struct {
err error
}
+var readModGraphDebugOnce sync.Once
+
// readModGraph reads and returns the module dependency graph starting at the
// given roots.
//
// Unlike LoadModGraph, readModGraph does not attempt to diagnose or update
// inconsistent roots.
func readModGraph(ctx context.Context, depth modDepth, roots []module.Version) (*ModuleGraph, error) {
+ if depth == lazy {
+ readModGraphDebugOnce.Do(func() {
+ for _, f := range strings.Split(os.Getenv("GODEBUG"), ",") {
+ switch f {
+ case "lazymod=log":
+ debug.PrintStack()
+ fmt.Fprintf(os.Stderr, "go: read full module graph.\n")
+ case "lazymod=strict":
+ debug.PrintStack()
+ base.Fatalf("go: read full module graph (forbidden by GODEBUG=lazymod=strict).")
+ }
+ }
+ })
+ }
+
var (
mu sync.Mutex // guards mg.g and hasError during loading
hasError bool