use different variants for server/client handlers

This commit is contained in:
Ilia Tsyplenkov 2025-02-04 00:21:27 +03:00
parent 7ef9c891dc
commit 2502299233
3 changed files with 11 additions and 5 deletions

View file

@ -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()
}

View file

@ -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)
if force {
h.cancelRoot()
h.callWG.Wait()
} else {
h.callWG.Wait()
h.cancelRoot()
}
h.cancelServerSubscriptions(err)
}

View file

@ -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 {