@@ -89,6 +89,14 @@ func (t *svrTransHandler) Write(ctx context.Context, conn net.Conn, sendMsg remo
8989func (t * svrTransHandler ) Read (ctx context.Context , conn net.Conn , recvMsg remote.Message ) (nctx context.Context , err error ) {
9090 var bufReader remote.ByteBuffer
9191 defer func () {
92+ if r := recover (); r != nil {
93+ stack := string (debug .Stack ())
94+ panicErr := kerrors .ErrPanic .WithCauseAndStack (fmt .Errorf ("[happened in Read] %s" , r ), stack )
95+ rpcStats := rpcinfo .AsMutableRPCStats (recvMsg .RPCInfo ().Stats ())
96+ rpcStats .SetPanicked (panicErr )
97+ err = remote .NewTransError (remote .ProtocolError , kerrors .ErrPanic .WithCauseAndStack (fmt .Errorf ("[happened in Read] %s" , r ), stack ))
98+ nctx = ctx
99+ }
92100 t .ext .ReleaseBuffer (bufReader , err )
93101 rpcinfo .Record (ctx , recvMsg .RPCInfo (), stats .ReadFinish , err )
94102 }()
@@ -133,9 +141,8 @@ func (t *svrTransHandler) OnRead(ctx context.Context, conn net.Conn) (err error)
133141 var sendMsg remote.Message
134142 closeConnOutsideIfErr := true
135143 defer func () {
136- panicErr := recover ()
137- var wrapErr error
138- if panicErr != nil {
144+ var panicErr error
145+ if r := recover (); r != nil {
139146 stack := string (debug .Stack ())
140147 if conn != nil {
141148 ri := rpcinfo .GetRPCInfo (ctx )
@@ -144,10 +151,9 @@ func (t *svrTransHandler) OnRead(ctx context.Context, conn net.Conn) (err error)
144151 } else {
145152 klog .CtxErrorf (ctx , "KITEX: panic happened, error=%v\n stack=%s" , panicErr , stack )
146153 }
147- if err != nil {
148- wrapErr = kerrors .ErrPanic .WithCauseAndStack (fmt .Errorf ("[happened in OnRead] %s, last error=%s" , panicErr , err .Error ()), stack )
149- } else {
150- wrapErr = kerrors .ErrPanic .WithCauseAndStack (fmt .Errorf ("[happened in OnRead] %s" , panicErr ), stack )
154+ panicErr = kerrors .ErrPanic .WithCauseAndStack (fmt .Errorf ("[happened in OnRead] %s" , panicErr ), stack )
155+ if err == nil {
156+ err = panicErr
151157 }
152158 }
153159 t .finishTracer (ctx , ri , err , panicErr )
@@ -158,10 +164,9 @@ func (t *svrTransHandler) OnRead(ctx context.Context, conn net.Conn) (err error)
158164 if rpcinfo .PoolEnabled () {
159165 t .opt .InitOrResetRPCInfoFunc (ri , conn .RemoteAddr ())
160166 }
161- if wrapErr != nil {
162- err = wrapErr
163- }
164167 if err != nil && ! closeConnOutsideIfErr {
168+ // when error is not nil, outside will close conn,
169+ // set err to nil to indicate that this kind of error does not require closing the connection
165170 err = nil
166171 }
167172 }()
@@ -186,7 +191,7 @@ func (t *svrTransHandler) OnRead(ctx context.Context, conn net.Conn) (err error)
186191 // reply processing
187192 var methodInfo serviceinfo.MethodInfo
188193 if methodInfo , err = GetMethodInfo (ri , svcInfo ); err != nil {
189- // it won't be err , because the method has been checked in decode, err check here just do defensive inspection
194+ // it won't be error , because the method has been checked in decode, err check here just do defensive inspection
190195 t .writeErrorReplyIfNeeded (ctx , recvMsg , conn , err , ri , true )
191196 // for proxy case, need read actual remoteAddr, error print must exec after writeErrorReplyIfNeeded,
192197 // t.OnError(ctx, err, conn) will be executed at outer function when transServer close the conn
0 commit comments