in internal/remote/remote_client.go [173:238]
func (c *remotingClient) receiveResponse(r *tcpConnWrapper) {
var err error
header := primitive.GetHeader()
defer primitive.BackHeader(header)
for {
if err != nil {
// conn has been closed actively
if r.isClosed(err) {
return
}
// ignore name server connection read timeout
var isTimeout bool
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
isTimeout = true
}
if !(err == io.EOF || isTimeout) {
rlog.Error("conn error, close connection", map[string]interface{}{
"remoteAddr": r.RemoteAddr(),
"localAddr": r.LocalAddr(),
rlog.LogKeyUnderlayError: err,
})
} else {
rlog.Debug("conn error, close connection", map[string]interface{}{
"remoteAddr": r.RemoteAddr(),
"localAddr": r.LocalAddr(),
rlog.LogKeyUnderlayError: err,
})
}
c.closeConnection(r)
r.destroy()
break
}
err = r.Conn.SetReadDeadline(time.Now().Add(c.config.ReadTimeout))
if err != nil {
continue
}
_, err = io.ReadFull(r, *header)
if err != nil {
continue
}
var length int32
err = binary.Read(bytes.NewReader(*header), binary.BigEndian, &length)
if err != nil {
continue
}
buf := make([]byte, length)
_, err = io.ReadFull(r, buf)
if err != nil {
continue
}
cmd, err := decode(buf)
if err != nil {
rlog.Error("decode RemotingCommand error", map[string]interface{}{
rlog.LogKeyUnderlayError: err,
})
continue
}
c.processCMD(cmd, r)
}
}