From cbff713e68a1378713f1692cbfe13499106de7eb Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 30 Apr 2021 01:29:57 -0400 Subject: [PATCH] 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 Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/buildlist.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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