good morning!!!!

Skip to content
Snippets Groups Projects
Commit 8d815e36 authored by Felix Lange's avatar Felix Lange Committed by Péter Szilágyi
Browse files

rpc: fix rare deadlock when canceling HTTP call context (#19715)

When cancelling the context for a call on a HTTP-based client while the
call is running, the select in requestOp.wait may hit the <-context.Done()
case instead of the <-op.resp case. This doesn't happen often -- our
cancel test hasn't caught this even though it ran thousands of times
on CI since the RPC client was added.

Fixes #19714
parent 3271a5af
No related branches found
No related tags found
No related merge requests found
...@@ -137,9 +137,11 @@ func (op *requestOp) wait(ctx context.Context, c *Client) (*jsonrpcMessage, erro ...@@ -137,9 +137,11 @@ func (op *requestOp) wait(ctx context.Context, c *Client) (*jsonrpcMessage, erro
select { select {
case <-ctx.Done(): case <-ctx.Done():
// Send the timeout to dispatch so it can remove the request IDs. // Send the timeout to dispatch so it can remove the request IDs.
select { if !c.isHTTP {
case c.reqTimeout <- op: select {
case <-c.closing: case c.reqTimeout <- op:
case <-c.closing:
}
} }
return nil, ctx.Err() return nil, ctx.Err()
case resp := <-op.resp: case resp := <-op.resp:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment