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>
This commit is contained in:
Rebecca Stambler 2020-10-30 00:30:19 -04:00
parent 51cde5226e
commit 8860a70d10
1 changed files with 8 additions and 0 deletions

View File

@ -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()