diff options
author | Bryan C. Mills <bcmills@google.com> | 2021-04-30 01:29:57 -0400 |
---|---|---|
committer | Bryan C. Mills <bcmills@google.com> | 2021-04-30 18:14:29 +0000 |
commit | cbff713e68a1378713f1692cbfe13499106de7eb (patch) | |
tree | 9d99af5ffe196174e71dbb2ca366ab16406e11be /src/cmd/go/internal/modload/buildlist.go | |
parent | eb71887b99fa656ed627c9c1d41319b9198979c8 (diff) | |
download | go-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.go | 19 |
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 |