internal/lsp/cache: set a 15 minute deadline on calls to packages.Load
We've recently noticed multiple instances of `go list` hanging
indefinitely during an initial workspace load. Heschi suggested setting
a 5 minute deadline on the IWL, but it seems reasonable to set this
deadline on all calls to packages.Load since that calls `go list`.
I also started with a 15 minute deadline to be a little more careful.
Do you think this is risky enough to merit an experimental setting?
Fixes golang/go#42132
Change-Id: I0a38741f3d99b6a38c46c3e663daf61f2cb45581
Reviewed-on: https://go-review.googlesource.com/c/tools/+/266478
Trust: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go
index 5a67a17..9eed1c4 100644
--- a/internal/lsp/cache/load.go
+++ b/internal/lsp/cache/load.go
@@ -13,6 +13,7 @@
"path/filepath"
"sort"
"strings"
+ "time"
"golang.org/x/tools/go/packages"
"golang.org/x/tools/internal/event"
@@ -98,6 +99,13 @@
if err != nil {
return err
}
+
+ // Set a last resort deadline on packages.Load since it calls the go
+ // command, which may hang indefinitely if it has a bug. golang/go#42132
+ // and golang/go#42255 have more context.
+ ctx, cancel := context.WithTimeout(ctx, 15*time.Minute)
+ defer cancel()
+
cfg := s.config(ctx, inv)
pkgs, err := packages.Load(cfg, query...)
cleanup()