rpc/dataconn: always close send stream returned from Sender.Send()

discovered while debugging #457
This commit is contained in:
Christian Schwarz 2021-09-19 20:00:06 +02:00
parent 4f9b63aa09
commit 2c9fcd7c14

View File

@ -172,6 +172,15 @@ func (s *Server) serveConnRequest(ctx context.Context, endpoint string, c *strea
return return
} }
res, sendStream, handlerErr = s.h.Send(ctx, &req) // SHADOWING res, sendStream, handlerErr = s.h.Send(ctx, &req) // SHADOWING
// ensure that we always close the sendStream
if sendStream != nil {
defer func() {
err := sendStream.Close()
if err != nil {
s.log.WithError(err).Error("cannot close send stream")
}
}()
}
case EndpointRecv: case EndpointRecv:
var req pdu.ReceiveReq var req pdu.ReceiveReq
if err := proto.Unmarshal(reqStructured, &req); err != nil { if err := proto.Unmarshal(reqStructured, &req); err != nil {
@ -239,12 +248,9 @@ func (s *Server) serveConnRequest(ctx context.Context, endpoint string, c *strea
if sendStream != nil { if sendStream != nil {
err := c.SendStream(ctx, sendStream, ZFSStream) err := c.SendStream(ctx, sendStream, ZFSStream)
closeErr := sendStream.Close()
if closeErr != nil {
s.log.WithError(closeErr).Error("cannot close send stream")
}
if err != nil { if err != nil {
s.log.WithError(err).Error("cannot write send stream") s.log.WithError(err).Error("cannot write send stream")
} }
// sendStream.Close() done via defer above
} }
} }