From 0f731471ab258d9e01658f0ab70f8317fd0fb89c Mon Sep 17 00:00:00 2001 From: Ondrej Fabry Date: Wed, 12 Sep 2018 17:38:36 +0200 Subject: Recover possible panic in EncodeMsg and improve debug logs Change-Id: I771c171ae30a957f4436e7f4ba834d8a38d02f80 Signed-off-by: Ondrej Fabry --- core/request_handler.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'core') diff --git a/core/request_handler.go b/core/request_handler.go index c042948..e52e262 100644 --- a/core/request_handler.go +++ b/core/request_handler.go @@ -39,7 +39,9 @@ func (c *Connection) watchRequests(ch *Channel) { c.releaseAPIChannel(ch) return } - c.processRequest(ch, req) + if err := c.processRequest(ch, req); err != nil { + sendReplyError(ch, req, err) + } } } } @@ -50,39 +52,36 @@ func (c *Connection) processRequest(ch *Channel, req *vppRequest) error { if atomic.LoadUint32(&c.connected) == 0 { err := ErrNotConnected log.Errorf("processing request failed: %v", err) - sendReplyError(ch, req, err) return err } // retrieve message ID msgID, err := c.GetMessageID(req.msg) if err != nil { - err = fmt.Errorf("unable to retrieve message ID: %v", err) log.WithFields(logger.Fields{ "msg_name": req.msg.GetMessageName(), "msg_crc": req.msg.GetCrcString(), "seq_num": req.seqNum, - }).Error(err) - sendReplyError(ch, req, err) - return err + "error": err, + }).Errorf("failed to retrieve message ID") + return fmt.Errorf("unable to retrieve message ID: %v", err) } // encode the message into binary data, err := c.codec.EncodeMsg(req.msg, msgID) if err != nil { - err = fmt.Errorf("unable to encode the messge: %v", err) log.WithFields(logger.Fields{ "channel": ch.id, "msg_id": msgID, "msg_name": req.msg.GetMessageName(), "seq_num": req.seqNum, - }).Error(err) - sendReplyError(ch, req, err) - return err + "error": err, + }).Errorf("failed to encode message: %#v", req.msg) + return fmt.Errorf("unable to encode the message: %v", err) } - // get context context := packRequestContext(ch.id, req.multi, req.seqNum) + if log.Level == logger.DebugLevel { // for performance reasons - logrus does some processing even if debugs are disabled log.WithFields(logger.Fields{ "channel": ch.id, @@ -104,7 +103,6 @@ func (c *Connection) processRequest(ch *Channel, req *vppRequest) error { "msg_id": msgID, "seq_num": req.seqNum, }).Error(err) - sendReplyError(ch, req, err) return err } -- cgit 1.2.3-korg