Skip to content

Commit 2d443be

Browse files
authored
Send vl_api_sockclnt_delete_t message on disconnect (#248)
This change practically reverts previous commit [1548c7e](1548c7e), because it seems VPP is not correctly cleaning up opened sockets when they are closed from client side, which increases CPU usage of VPP. This correctly sets client_index field for the message unlike previous implementation. Signed-off-by: Ondrej Fabry <ondrej@fabry.dev>
1 parent 4574cf0 commit 2d443be

1 file changed

Lines changed: 47 additions & 2 deletions

File tree

adapter/socketclient/socketclient.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,10 @@ func (c *Client) Disconnect() error {
295295
// wait for readerLoop to return
296296
c.wg.Wait()
297297

298-
// Don't bother sending a vl_api_sockclnt_delete_t message,
299-
// just close the socket.
298+
if err := c.close(); err != nil {
299+
log.Debugf("closing failed: %v", err)
300+
}
301+
300302
if err := c.disconnect(); err != nil {
301303
return err
302304
}
@@ -408,6 +410,49 @@ func (c *Client) open(clientName string) error {
408410
return nil
409411
}
410412

413+
func (c *Client) close() error {
414+
var msgCodec = codec.DefaultCodec
415+
416+
req := &memclnt.SockclntDelete{
417+
Index: c.clientIndex,
418+
}
419+
msg, err := msgCodec.EncodeMsg(req, c.sockDelMsgId)
420+
if err != nil {
421+
log.Debugln("Encode error:", err)
422+
return err
423+
}
424+
setMsgRequestHeader(msg, c.clientIndex, uint32(deleteMsgContext))
425+
426+
log.Infof("sending socklntDel (%d bytes): % 0X", len(msg), msg)
427+
428+
if err := c.writeMsg(msg); err != nil {
429+
log.Debugln("Write error: ", err)
430+
return err
431+
}
432+
433+
msgReply, err := c.readMsgTimeout(nil, c.disconnectTimeout)
434+
if err != nil {
435+
var nerr net.Error
436+
if errors.As(err, &nerr) && nerr.Timeout() {
437+
log.Info("sockclnt_delete_reply: timeout")
438+
// we accept timeout for reply
439+
return nil
440+
}
441+
log.Debugln("Read sockclnt_delete_reply error:", err)
442+
return err
443+
}
444+
445+
reply := new(memclnt.SockclntDeleteReply)
446+
if err := msgCodec.DecodeMsg(msgReply, reply); err != nil {
447+
log.Debugln("Decoding sockclnt_delete_reply failed:", err)
448+
return err
449+
} else if reply.Response != 0 {
450+
return fmt.Errorf("sockclnt_delete_reply: response error (%d)", reply.Response)
451+
}
452+
453+
return nil
454+
}
455+
411456
func (c *Client) setMsgTable(msgTable map[string]uint16, sockDelMsgId uint16) {
412457
c.msgTableMu.Lock()
413458
defer c.msgTableMu.Unlock()

0 commit comments

Comments
 (0)