mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-29 23:33:37 +00:00
rpc: avoid panic during request after WS connection is closed
Fix the following panic: ``` panic: assignment to entry in nil map goroutine 131 [running]: github.com/nspcc-dev/neo-go/pkg/rpc/client.(*WSClient).registerRespChannel(0xc00033c240, 0x0, 0xc00003e2a0) /home/denis/go/pkg/mod/github.com/nspcc-dev/neo-go@v0.98.2/pkg/rpc/client/wsclient.go:244 +0x96 github.com/nspcc-dev/neo-go/pkg/rpc/client.(*WSClient).makeWsRequest(0xc00033c240, 0xc002080000) /home/denis/go/pkg/mod/github.com/nspcc-dev/neo-go@v0.98.2/pkg/rpc/client/wsclient.go:264 +0x69 github.com/nspcc-dev/neo-go/pkg/rpc/client.(*Client).performRequest(0xc00033c240, {0xc9f173, 0xd}, {{0x13d09d0, 0x0, 0x0}}, {0xb44120, 0xc00147a000}) /home/denis/go/pkg/mod/github.com/nspcc-dev/neo-go@v0.98.2/pkg/rpc/client/client.go:186 +0x15d github.com/nspcc-dev/neo-go/pkg/rpc/client.(*Client).GetBlockCount(0xc001fb5440) /home/denis/go/pkg/mod/github.com/nspcc-dev/neo-go@v0.98.2/pkg/rpc/client/rpc.go:73 +0x69 ... ```
This commit is contained in:
parent
a7fe85a2d8
commit
b1f74b549d
2 changed files with 24 additions and 8 deletions
|
@ -243,12 +243,6 @@ func (c *WSClient) wsWriter() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *WSClient) registerRespChannel(id uint64, ch chan *response.Raw) {
|
|
||||||
c.respLock.Lock()
|
|
||||||
defer c.respLock.Unlock()
|
|
||||||
c.respChannels[id] = ch
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *WSClient) unregisterRespChannel(id uint64) {
|
func (c *WSClient) unregisterRespChannel(id uint64) {
|
||||||
c.respLock.Lock()
|
c.respLock.Lock()
|
||||||
defer c.respLock.Unlock()
|
defer c.respLock.Unlock()
|
||||||
|
@ -266,8 +260,15 @@ func (c *WSClient) getResponseChannel(id uint64) chan *response.Raw {
|
||||||
|
|
||||||
func (c *WSClient) makeWsRequest(r *request.Raw) (*response.Raw, error) {
|
func (c *WSClient) makeWsRequest(r *request.Raw) (*response.Raw, error) {
|
||||||
ch := make(chan *response.Raw)
|
ch := make(chan *response.Raw)
|
||||||
c.registerRespChannel(r.ID, ch)
|
c.respLock.Lock()
|
||||||
|
select {
|
||||||
|
case <-c.done:
|
||||||
|
c.respLock.Unlock()
|
||||||
|
return nil, errors.New("connection lost before registering response channel")
|
||||||
|
default:
|
||||||
|
c.respChannels[r.ID] = ch
|
||||||
|
c.respLock.Unlock()
|
||||||
|
}
|
||||||
select {
|
select {
|
||||||
case <-c.done:
|
case <-c.done:
|
||||||
return nil, errors.New("connection lost before sending the request")
|
return nil, errors.New("connection lost before sending the request")
|
||||||
|
|
|
@ -453,3 +453,18 @@ func TestWSDoubleClose(t *testing.T) {
|
||||||
c.Close()
|
c.Close()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWS_RequestAfterClose(t *testing.T) {
|
||||||
|
srv := initTestServer(t, "")
|
||||||
|
|
||||||
|
c, err := NewWS(context.TODO(), httpURLtoWS(srv.URL), Options{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
c.Close()
|
||||||
|
|
||||||
|
require.NotPanics(t, func() {
|
||||||
|
_, err = c.GetBlockCount()
|
||||||
|
})
|
||||||
|
require.Error(t, err)
|
||||||
|
require.True(t, strings.Contains(err.Error(), "connection lost before registering response channel"))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue