server: Fix connection leak when receiving ECONNRESET

The ttrpc server somtimes receives `ECONNRESET` rather than `EOF` when
the client is exited. Such as reading from a closed connection. Handle
it properly to avoid goroutine and connection leak.

Change-Id: If32711cfc1347dd2da27ca846dd13c3f5af351bb
Signed-off-by: liyuxuan.darfux <liyuxuan.darfux@bytedance.com>
This commit is contained in:
liyuxuan.darfux 2022-09-21 16:26:41 +08:00
parent 9c6e106d2d
commit a03aa04591

View File

@ -18,11 +18,13 @@ package ttrpc
import ( import (
"context" "context"
"errors"
"io" "io"
"math/rand" "math/rand"
"net" "net"
"sync" "sync"
"sync/atomic" "sync/atomic"
"syscall"
"time" "time"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -525,14 +527,12 @@ func (c *serverConn) run(sctx context.Context) {
// branch. Basically, it means that we are no longer receiving // branch. Basically, it means that we are no longer receiving
// requests due to a terminal error. // requests due to a terminal error.
recvErr = nil // connection is now "closing" recvErr = nil // connection is now "closing"
if err == io.EOF || err == io.ErrUnexpectedEOF { if err == io.EOF || err == io.ErrUnexpectedEOF || errors.Is(err, syscall.ECONNRESET) {
// The client went away and we should stop processing // The client went away and we should stop processing
// requests, so that the client connection is closed // requests, so that the client connection is closed
return return
} }
if err != nil { logrus.WithError(err).Error("error receiving message")
logrus.WithError(err).Error("error receiving message")
}
// else, initiate shutdown // else, initiate shutdown
case <-shutdown: case <-shutdown:
return return