1
0
mirror of https://github.com/golang/go synced 2024-11-05 11:36:10 -07:00
go/internal/jsonrpc2
Rob Findley 88be01311a internal/jsonrpc2: fix races in cancellation
We had a deadlock in cases where a request was cancelled (1) after being
written to the stream, but (2) before a response was received. This
resulted in the request ID being removed from the pending map while the
server has the request, after which point the server response would hang
in Conn.Run trying to send to a nil channel.

After fixing this nil send there was still a race: it was possible that
Conn.Run could get the pending request, and Conn.Call would select
ctx.Done before Conn.Run could send to the response channel, again
resulting in a blocking send. Fix this by adding a buffer to the
response channel.

The response channel management is also made less forgiving, because we
should be able to reason precisely about how many sends and receives
will occur:
 + Don't close the response channel after sending a response: there
   should only be one recipient.
 + Don't delete the ID from pending map twice: it should only be cleaned
   up by Conn.Call.

Cancellation tests in the lsprpc package are updated to exercise the
race conditions.

Fixes golang/go#37159

Change-Id: Ie3207442ea910f79247b18d8647fd52f39fb15db
Reviewed-on: https://go-review.googlesource.com/c/tools/+/219126
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
2020-02-14 14:43:24 +00:00
..
servertest internal/lsp: refactor LSP server instantiation 2020-02-06 23:12:37 +00:00
handler.go internal/lsp: cancel early 2019-10-22 07:49:31 +00:00
jsonrpc2_test.go internal/jsonrpc2: fix invalid invocations of Fatalf in goroutines 2020-02-05 19:51:38 +00:00
jsonrpc2.go internal/jsonrpc2: fix races in cancellation 2020-02-14 14:43:24 +00:00
serve.go internal/lsp: refactor LSP server instantiation 2020-02-06 23:12:37 +00:00
stream.go internal/jsonrpc2: add telemetry to the rpc system 2019-06-27 03:32:48 +00:00
wire.go all: fix some staticcheck errors 2020-01-29 04:53:41 +00:00