go/internal
Bryan C. Mills 739f55d751 internal/jsonrpc2_v2: rework Connection concurrency
This change fixes the semantics of Close to actually wait for
in-flight requests before closing the ReadWriteCloser. (Previously,
the Close method closed the ReadWriteCloser immediately, which I
suspect is what led to many of the failures observed in
golang/go#49387 and golang/go#46520.)

It achieves this by explicitly tracking the number of in-flight
requests, including requests with pending async responses, and
explicitly rejecting new Call requests (while keeping the read loop
open!) once Close has begun.

To make it easier for me to reason about the request lifetimes, I
reduced the number of long-lived goroutines from three to just one
(the Read loop), with an additional Handler goroutine that runs only
while the Handler queue is non-empty. Now, it is clearer (I hope!)
that the number of in-flight async requests strictly decreases
after Close has begun, even though the Read goroutine continues
to read requests (and, importantly, responses) and to forward
Notifications to the preempter.

For golang/go#49387
For golang/go#46520

Change-Id: Idf5960f848108a7ced78c5382099c8692e9b181e
Reviewed-on: https://go-review.googlesource.com/c/tools/+/388134
gopls-CI: kokoro <noreply+kokoro@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
2022-10-31 15:02:00 +00:00
..
analysisinternal gopls/.../fillstruct: support generic types 2022-09-30 19:58:05 +00:00
apidiff
bug gopls: migrate internal/lsp to gopls/internal/lsp 2022-09-07 16:44:44 +00:00
diff gopls/internal/lsp/source: sort protocol edits 2022-10-11 18:07:12 +00:00
event gopls: migrate internal/lsp to gopls/internal/lsp 2022-09-07 16:44:44 +00:00
facts internal/facts: share go/analysis/internal/facts with gopls 2022-10-25 15:31:58 +00:00
fakenet
fastwalk internal/fastwalk: improve Darwin performance by ~3x 2022-10-13 16:31:57 +00:00
fuzzy gopls/.../fillstruct: support generic types 2022-09-30 19:58:05 +00:00
gocommand go/packages: issue error if 'go list' on PATH is too new 2022-09-28 14:34:08 +00:00
gopathwalk
goroot go/internal/gcimporter: update to anticipate missing targets and .as 2022-10-26 20:17:01 +00:00
imports internal/imports: repair warnings from default analyzers 2022-10-19 15:24:07 +00:00
jsonrpc2 all: use constant to avoid repeated definitions 2022-09-19 15:32:23 +00:00
jsonrpc2_v2 internal/jsonrpc2_v2: rework Connection concurrency 2022-10-31 15:02:00 +00:00
loopclosure go/analysis/passes/loopclosure: experiment with checking t.Run+Parallel 2022-09-20 22:09:32 +00:00
memoize internal/memoize: fix race in Store.Promise 2022-07-28 15:35:11 +00:00
packagesinternal
persistent internal/lsp/cache: use GetHandle not Bind for 5 URI-keyed maps 2022-07-07 16:57:02 +00:00
proxydir
stack
testenv go/internal/gcimporter: update to anticipate missing targets and .as 2022-10-26 20:17:01 +00:00
tool
typeparams x/tools/internal/typeparams: use regexp to match wanted result 2022-09-02 19:06:05 +00:00
typesinternal
xcontext