diff --git a/rpc/client.go b/rpc/client.go index f9a8f1116b..af59125a1a 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -125,7 +125,7 @@ func (c *Client) newClientConn(conn ServerCodec) *clientConn { } func (cc *clientConn) close(err error, inflightReq *requestOp) { - cc.handler.close(err, inflightReq) + cc.handler.close(err, inflightReq, true) cc.codec.close() } diff --git a/rpc/handler.go b/rpc/handler.go index 2b80fefe4c..cbf46b4b99 100644 --- a/rpc/handler.go +++ b/rpc/handler.go @@ -313,10 +313,16 @@ func (h *handler) handleNonBatchCall(cp *callProc, msg *jsonrpcMessage) { // close cancels all requests except for inflightReq and waits for // call goroutines to shut down. -func (h *handler) close(err error, inflightReq *requestOp) { +// force = true must be user only for client-side handlers. +func (h *handler) close(err error, inflightReq *requestOp, force bool) { h.cancelAllRequests(err, inflightReq) - h.cancelRoot() - h.callWG.Wait() + if force { + h.cancelRoot() + h.callWG.Wait() + } else { + h.callWG.Wait() + h.cancelRoot() + } h.cancelServerSubscriptions(err) } diff --git a/rpc/server.go b/rpc/server.go index 42b59f8f6f..7ec9dd202e 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -149,7 +149,7 @@ func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) { h := newHandler(ctx, codec, s.idgen, &s.services, s.batchItemLimit, s.batchResponseLimit) h.allowSubscribe = false - defer h.close(io.EOF, nil) + defer h.close(io.EOF, nil, false) reqs, batch, err := codec.readBatch() if err != nil {