From 8860a70d10e6875a63af73f22140e675b250a56f Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Fri, 30 Oct 2020 00:30:19 -0400 Subject: [PATCH] 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 Run-TryBot: Rebecca Stambler gopls-CI: kokoro TryBot-Result: Go Bot Reviewed-by: Heschi Kreinick --- internal/lsp/cache/load.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go index 5a67a1732d..9eed1c4c91 100644 --- a/internal/lsp/cache/load.go +++ b/internal/lsp/cache/load.go @@ -13,6 +13,7 @@ import ( "path/filepath" "sort" "strings" + "time" "golang.org/x/tools/go/packages" "golang.org/x/tools/internal/event" @@ -98,6 +99,13 @@ func (s *snapshot) load(ctx context.Context, scopes ...interface{}) error { 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()