Skip to content

Commit cbdb759

Browse files
committed
Fix unstable vz network issue
Signed-off-by: Balaji Vijayakumar <[email protected]>
1 parent 4894d85 commit cbdb759

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

pkg/networks/usernet/UDPFileConn.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package usernet
2+
3+
import (
4+
"errors"
5+
"net"
6+
"time"
7+
)
8+
9+
type UDPFileConn struct {
10+
net.Conn
11+
}
12+
13+
func (conn *UDPFileConn) Read(b []byte) (n int, err error) {
14+
// Check if the connection has been closed
15+
if err := conn.SetReadDeadline(time.Time{}); err != nil {
16+
if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "use of closed network connection" {
17+
return 0, errors.New("UDPFileConn connection closed")
18+
}
19+
}
20+
return conn.Conn.Read(b)
21+
}

pkg/networks/usernet/gvproxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,11 @@ func listenFD(ctx context.Context, vn *virtualnetwork.VirtualNetwork) error {
163163
files[0].Close()
164164

165165
go func() {
166-
err = vn.AcceptBess(ctx, fileConn)
166+
err = vn.AcceptBess(ctx, &UDPFileConn{Conn: fileConn})
167167
if err != nil {
168168
logrus.Error("FD connection closed with error", err)
169169
}
170-
defer fileConn.Close()
170+
fileConn.Close()
171171
}()
172172
select {
173173
case <-ctx.Done():

pkg/vz/vm_darwin.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ type virtualMachineWrapper struct {
3636
stopped bool
3737
}
3838

39+
// Hold all *os.File created via socketpair() so that they won't get garbage collected. f.FD() gets invalid if f gets garbage collected.
40+
var vmNetworkFiles = make([]*os.File, 1)
41+
3942
func startVM(ctx context.Context, driver *driver.BaseDriver) (*virtualMachineWrapper, chan error, error) {
4043
usernetClient, err := startUsernet(ctx, driver)
4144
if err != nil {
@@ -57,7 +60,11 @@ func startVM(ctx context.Context, driver *driver.BaseDriver) (*virtualMachineWra
5760
errCh := make(chan error)
5861
go func() {
5962
//Handle errors via errCh and handle stop vm during context close
60-
63+
defer func() {
64+
for i := range vmNetworkFiles {
65+
vmNetworkFiles[i].Close()
66+
}
67+
}()
6168
for {
6269
select {
6370
case <-ctx.Done():
@@ -700,5 +707,14 @@ func createSockPair() (*os.File, *os.File, error) {
700707
if err = syscall.SetsockoptInt(clientFD, syscall.SOL_SOCKET, syscall.SO_RCVBUF, 4*1024*1024); err != nil {
701708
return nil, nil, err
702709
}
703-
return os.NewFile(uintptr(serverFD), "server"), os.NewFile(uintptr(clientFD), "client"), nil
710+
server := os.NewFile(uintptr(serverFD), "server")
711+
client := os.NewFile(uintptr(clientFD), "client")
712+
runtime.SetFinalizer(server, func(file *os.File) {
713+
logrus.Debugf("Server network file GC'ed")
714+
})
715+
runtime.SetFinalizer(client, func(file *os.File) {
716+
logrus.Debugf("Client network file GC'ed")
717+
})
718+
vmNetworkFiles = append(vmNetworkFiles, server, client)
719+
return server, client, nil
704720
}

0 commit comments

Comments
 (0)