Skip to content

Commit

Permalink
Fix unstable vz network issue
Browse files Browse the repository at this point in the history
Signed-off-by: Balaji Vijayakumar <[email protected]>
  • Loading branch information
balajiv113 committed May 19, 2023
1 parent 4894d85 commit cbdb759
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 4 deletions.
21 changes: 21 additions & 0 deletions pkg/networks/usernet/UDPFileConn.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package usernet

import (
"errors"
"net"
"time"
)

type UDPFileConn struct {
net.Conn
}

func (conn *UDPFileConn) Read(b []byte) (n int, err error) {
// Check if the connection has been closed
if err := conn.SetReadDeadline(time.Time{}); err != nil {
if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "use of closed network connection" {
return 0, errors.New("UDPFileConn connection closed")
}
}
return conn.Conn.Read(b)
}
4 changes: 2 additions & 2 deletions pkg/networks/usernet/gvproxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,11 @@ func listenFD(ctx context.Context, vn *virtualnetwork.VirtualNetwork) error {
files[0].Close()

go func() {
err = vn.AcceptBess(ctx, fileConn)
err = vn.AcceptBess(ctx, &UDPFileConn{Conn: fileConn})
if err != nil {
logrus.Error("FD connection closed with error", err)
}
defer fileConn.Close()
fileConn.Close()
}()
select {
case <-ctx.Done():
Expand Down
20 changes: 18 additions & 2 deletions pkg/vz/vm_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ type virtualMachineWrapper struct {
stopped bool
}

// Hold all *os.File created via socketpair() so that they won't get garbage collected. f.FD() gets invalid if f gets garbage collected.
var vmNetworkFiles = make([]*os.File, 1)

func startVM(ctx context.Context, driver *driver.BaseDriver) (*virtualMachineWrapper, chan error, error) {
usernetClient, err := startUsernet(ctx, driver)
if err != nil {
Expand All @@ -57,7 +60,11 @@ func startVM(ctx context.Context, driver *driver.BaseDriver) (*virtualMachineWra
errCh := make(chan error)
go func() {
//Handle errors via errCh and handle stop vm during context close

defer func() {
for i := range vmNetworkFiles {
vmNetworkFiles[i].Close()
}
}()
for {
select {
case <-ctx.Done():
Expand Down Expand Up @@ -700,5 +707,14 @@ func createSockPair() (*os.File, *os.File, error) {
if err = syscall.SetsockoptInt(clientFD, syscall.SOL_SOCKET, syscall.SO_RCVBUF, 4*1024*1024); err != nil {
return nil, nil, err
}
return os.NewFile(uintptr(serverFD), "server"), os.NewFile(uintptr(clientFD), "client"), nil
server := os.NewFile(uintptr(serverFD), "server")
client := os.NewFile(uintptr(clientFD), "client")
runtime.SetFinalizer(server, func(file *os.File) {
logrus.Debugf("Server network file GC'ed")
})
runtime.SetFinalizer(client, func(file *os.File) {
logrus.Debugf("Client network file GC'ed")
})
vmNetworkFiles = append(vmNetworkFiles, server, client)
return server, client, nil
}

0 comments on commit cbdb759

Please sign in to comment.