From 57337531b75b38c57247ea4cfa40f8cdb188370c Mon Sep 17 00:00:00 2001 From: ningmingxiao Date: Fri, 12 Dec 2025 16:52:20 +0800 Subject: [PATCH] fix: catch discard error and return Signed-off-by: ningmingxiao --- channel.go | 4 +++- errors.go | 8 ++++++++ server.go | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/channel.go b/channel.go index 872261e6d..33553746b 100644 --- a/channel.go +++ b/channel.go @@ -125,7 +125,9 @@ 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{ + error: fmt.Errorf("failed to discard oversized message (length %d exceeds maximum message size %d): %w", mh.Length, messageLengthMax, err), + } } 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 1e6f6b9c9..bf2072fd3 100644 --- a/errors.go +++ b/errors.go @@ -84,3 +84,11 @@ func (e *OversizedMessageErr) RejectedLength() int { func (*OversizedMessageErr) MaximumLength() int { return messageLengthMax } + +type discardError struct { + error +} + +func (e *discardError) Unwrap() error { + return e.error +} diff --git a/server.go b/server.go index b8c0689cc..05f61c0da 100644 --- a/server.go +++ b/server.go @@ -560,6 +560,11 @@ func (c *serverConn) run(sctx context.Context) { // requests, so that the client connection is closed return } + var discardErr *discardError + if errors.As(err, &discardErr) { + log.G(ctx).WithError(err).Error("discard failed") + return + } log.G(ctx).WithError(err).Error("error receiving message") // else, initiate shutdown case <-shutdown: