From: Bryan C. Mills Date: Fri, 30 Apr 2021 05:29:57 +0000 (-0400) Subject: cmd/go: add GODEBUG tokens for debugging lazy module loading X-Git-Tag: go1.17beta1~322 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cbff713e68a1378713f1692cbfe13499106de7eb;p=gostls13.git 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 --- 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