From 58601b470bbd4e5ef534fed83511aa5a7f1c2d1e Mon Sep 17 00:00:00 2001 From: Matus Mrekaj Date: Tue, 22 Oct 2019 15:05:39 +0200 Subject: fix data races in proxy server Signed-off-by: Matus Mrekaj Change-Id: I932d560548ee816e28683243a7318a2a7fbbb24a --- core/connection.go | 31 ++++++++++++++++++------------- core/control_ping.go | 4 +++- core/request_handler.go | 2 +- 3 files changed, 22 insertions(+), 15 deletions(-) (limited to 'core') diff --git a/core/connection.go b/core/connection.go index 6f82616..264ec43 100644 --- a/core/connection.go +++ b/core/connection.go @@ -111,6 +111,9 @@ type Connection struct { lastReplyLock sync.Mutex // lock for the last reply lastReply time.Time // time of the last received reply from VPP + + msgControlPing api.Message + msgControlPingReply api.Message } func newConnection(binapi adapter.VppAPI, attempts int, interval time.Duration) *Connection { @@ -122,14 +125,16 @@ func newConnection(binapi adapter.VppAPI, attempts int, interval time.Duration) } c := &Connection{ - vppClient: binapi, - maxAttempts: attempts, - recInterval: interval, - codec: &codec.MsgCodec{}, - msgIDs: make(map[string]uint16), - msgMap: make(map[uint16]api.Message), - channels: make(map[uint16]*Channel), - subscriptions: make(map[uint16][]*subscriptionCtx), + vppClient: binapi, + maxAttempts: attempts, + recInterval: interval, + codec: &codec.MsgCodec{}, + msgIDs: make(map[string]uint16), + msgMap: make(map[uint16]api.Message), + channels: make(map[uint16]*Channel), + subscriptions: make(map[uint16][]*subscriptionCtx), + msgControlPing: msgControlPing, + msgControlPingReply: msgControlPingReply, } binapi.SetMsgCallback(c.msgCallback) return c @@ -314,7 +319,7 @@ func (c *Connection) healthCheckLoop(connChan chan ConnectionEvent) { } // send the control ping request - ch.reqChan <- &vppRequest{msg: msgControlPing} + ch.reqChan <- &vppRequest{msg: c.msgControlPing} for { // expect response within timeout period @@ -427,12 +432,12 @@ func (c *Connection) retrieveMessageIDs() (err error) { } n++ - if c.pingReqID == 0 && msg.GetMessageName() == msgControlPing.GetMessageName() { + if c.pingReqID == 0 && msg.GetMessageName() == c.msgControlPing.GetMessageName() { c.pingReqID = msgID - msgControlPing = reflect.New(reflect.TypeOf(msg).Elem()).Interface().(api.Message) - } else if c.pingReplyID == 0 && msg.GetMessageName() == msgControlPingReply.GetMessageName() { + c.msgControlPing = reflect.New(reflect.TypeOf(msg).Elem()).Interface().(api.Message) + } else if c.pingReplyID == 0 && msg.GetMessageName() == c.msgControlPingReply.GetMessageName() { c.pingReplyID = msgID - msgControlPingReply = reflect.New(reflect.TypeOf(msg).Elem()).Interface().(api.Message) + c.msgControlPingReply = reflect.New(reflect.TypeOf(msg).Elem()).Interface().(api.Message) } if debugMsgIDs { diff --git a/core/control_ping.go b/core/control_ping.go index cd447b7..b39fd3f 100644 --- a/core/control_ping.go +++ b/core/control_ping.go @@ -1,6 +1,8 @@ package core -import "git.fd.io/govpp.git/api" +import ( + "git.fd.io/govpp.git/api" +) var ( msgControlPing api.Message = new(ControlPing) diff --git a/core/request_handler.go b/core/request_handler.go index d3f7bdc..ddd5307 100644 --- a/core/request_handler.go +++ b/core/request_handler.go @@ -110,7 +110,7 @@ func (c *Connection) processRequest(ch *Channel, req *vppRequest) error { if req.multi { // send a control ping to determine end of the multipart response - pingData, _ := c.codec.EncodeMsg(msgControlPing, c.pingReqID) + pingData, _ := c.codec.EncodeMsg(c.msgControlPing, c.pingReqID) log.WithFields(logger.Fields{ "channel": ch.id, -- cgit 1.2.3-korg