From 874d8b98eba8129559b97d2fdfa02ddeb88b95f9 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Tue, 6 Jan 2026 17:18:48 -0500 Subject: [PATCH] cmd/go/internal/work: decrement concurrentProcesses when action finishes This fixes a bug where we only incremented concurrentProcesses but never decremented it, causing us to run out of tokens and give all compiles -c=1 after a point. Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64_c2s16-perf_vs_parent,gotip-linux-amd64_c3h88-perf_vs_parent,gotip-linux-arm64_c4ah72-perf_vs_parent,gotip-linux-arm64_c4as16-perf_vs_parent Change-Id: I41f4c1edb77004cbc1772d6d672045946a6a6964 Reviewed-on: https://go-review.googlesource.com/c/go/+/734260 Reviewed-by: David Chase Reviewed-by: Cherry Mui Reviewed-by: Michael Matloob TryBot-Bypass: Michael Matloob --- src/cmd/go/internal/work/exec.go | 5 +++++ src/cmd/go/internal/work/gc.go | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 654e9e9374..f2d1b1040b 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -248,6 +248,11 @@ func (b *Builder) Do(ctx context.Context, root *Action) { wg.Wait() + if tokens != totalTokens || concurrentProcesses != 0 { + base.Fatalf("internal error: tokens not restored at end of build: tokens: %d, totalTokens: %d, concurrentProcesses: %d", + tokens, totalTokens, concurrentProcesses) + } + // Write action graph again, this time with timing information. writeActionGraph() } diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index 9a5e6c924c..fc74715f22 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -227,6 +227,7 @@ func compilerConcurrency() (int, func()) { return c, func() { tokensMu.Lock() defer tokensMu.Unlock() + concurrentProcesses-- tokens += c } } @@ -235,6 +236,7 @@ var maxCompilerConcurrency = runtime.GOMAXPROCS(0) // max value we will use for var ( tokensMu sync.Mutex + totalTokens int // total number of tokens: this is used for checking that we get them all back in the end tokens int // number of available tokens concurrentProcesses int // number of currently running compiles ) @@ -246,6 +248,7 @@ func initCompilerConcurrencyPool() { // than what it was when we capped the concurrency to 4. oldConcurrencyCap := min(4, maxCompilerConcurrency) tokens = oldConcurrencyCap * cfg.BuildP + totalTokens = tokens } // trimpath returns the -trimpath argument to use -- 2.52.0