]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: add GODEBUG tokens for debugging lazy module loading
authorBryan C. Mills <bcmills@google.com>
Fri, 30 Apr 2021 05:29:57 +0000 (01:29 -0400)
committerBryan C. Mills <bcmills@google.com>
Fri, 30 Apr 2021 18:14:29 +0000 (18:14 +0000)
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>
src/cmd/go/internal/modload/buildlist.go

index e7af8929962ea73578e3e0fa0828742fb84b39ff..7820fcf6f1745a9d8a560ced8398b7defac43de9 100644 (file)
@@ -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