From 9fadfef0d7da3c7f6844bbf322dea04fd538e49e Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Mon, 29 Jul 2024 17:39:11 +0300 Subject: [PATCH] rpcclient/WS: do not deadlock on connection loss `makeWsRequest` creates a channel for response and waits for it. If between creating the channel and starting the reading `select` connection is lost (`writerDone` channel is closed), nothing reads from the channel and a deadlock appears. Looking at "done" channels when transferring RPC data solves the issue. Closes #3530. Signed-off-by: Pavel Karpy --- pkg/rpcclient/wsclient.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/rpcclient/wsclient.go b/pkg/rpcclient/wsclient.go index eed794d223..069ebd0b26 100644 --- a/pkg/rpcclient/wsclient.go +++ b/pkg/rpcclient/wsclient.go @@ -601,7 +601,13 @@ readloop: connCloseErr = fmt.Errorf("unknown response channel for response %d", id) break readloop // Unknown response (unexpected response ID). } - ch <- &rr.Response + select { + case <-c.writerDone: + break readloop + case <-c.shutdown: + break readloop + case ch <- &rr.Response: + } } else { // Malformed response, neither valid request, nor valid response. connCloseErr = fmt.Errorf("malformed response")