mirror of
https://github.com/golang/go
synced 2024-11-18 18:54:42 -07:00
5d34a75004
Filesystem walks of large GOPATHs/module caches can take seconds, especially on systems with slow filesystems like MacOS and WSL. We don't want to block completion requests on walks finishing. At the same time, cancelling a walk midway through results in an unusable cache, where we don't know which parts have been scanned so far. The best option is to run the walks in a separate goroutine. Then we can detach and let them finish. On the other side, we need to be able to reattach for the next completion request. Introduce a new method on caches, ScanAndListen, which first processes all the items in the cache, then notifies of any new items. This allows us to reattach to an existing scan without missing anything. The background scan introduces concurrency to the resolvers where there wasn't any before. We can't use mutexes, because there's no way to stop Lock() when a context expires. Use a 1-element semaphore channel to accomplish the same effect. Along the way: Only rescan GOPATH if the resolver has been cleared. None of this makes sense for GOPATH without that. Fix a bug where we were scanning the main module twice in module mode. Stop loading exports in module tests, it slows them down a ton. Change-Id: I978efae733ccba0c0cdc8e8fe6892bf5f15feac8 Reviewed-on: https://go-review.googlesource.com/c/tools/+/213217 Run-TryBot: Heschi Kreinick <heschi@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org> |
||
---|---|---|
.. | ||
apidiff | ||
fastwalk | ||
gopathwalk | ||
imports | ||
jsonrpc2 | ||
lsp | ||
memoize | ||
module | ||
semver | ||
span | ||
telemetry | ||
testenv | ||
tool | ||
xcontext |