diff --git a/channel.go b/channel.go index 872261e6d..36aaa1016 100644 --- a/channel.go +++ b/channel.go @@ -125,7 +125,7 @@ func (ch *channel) recv() (messageHeader, []byte, error) { if mh.Length > uint32(messageLengthMax) { if _, err := ch.br.Discard(int(mh.Length)); err != nil { - return mh, nil, fmt.Errorf("failed to discard after receiving oversized message: %w", err) + return mh, nil, DiscardError(fmt.Errorf("failed to discard after receiving oversized message: %w ,message length %v maximum message size %v", err, mh.Length, messageLengthMax)) } return mh, nil, status.Errorf(codes.ResourceExhausted, "message length %v exceed maximum message size of %v", mh.Length, messageLengthMax) diff --git a/errors.go b/errors.go index 632dbe8bd..ff181b95f 100644 --- a/errors.go +++ b/errors.go @@ -78,3 +78,20 @@ func (e *OversizedMessageErr) RejectedLength() int { func (*OversizedMessageErr) MaximumLength() int { return messageLengthMax } + +type DiscardErr struct { + err error +} + +func (d *DiscardErr) Error() string { + return d.err.Error() +} + +func DiscardError(err error) error { + if err == nil { + return nil + } + return &DiscardErr{ + err: err, + } +} diff --git a/server.go b/server.go index bb71de677..804565c8f 100644 --- a/server.go +++ b/server.go @@ -559,6 +559,11 @@ func (c *serverConn) run(sctx context.Context) { // requests, so that the client connection is closed return } + + if _, ok := err.(*DiscardErr); ok { + log.G(ctx).WithError(err).Error("discard failed") + return + } log.G(ctx).WithError(err).Error("error receiving message") // else, initiate shutdown case <-shutdown: