Skip to content

Commit a83ea45

Browse files
committed
guestagent: reuse netlink connections
Prior to this commit, `pkg/guestagent/sockets` opened and closed a netlink connection on each invocation of `sockets.List()`. Signed-off-by: Akihiro Suda <[email protected]>
1 parent a6de286 commit a83ea45

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

cmd/lima-guestagent/daemon_linux.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ func daemonAction(cmd *cobra.Command, _ []string) error {
7070
if err != nil {
7171
return err
7272
}
73+
defer agent.Close()
74+
7375
err = os.RemoveAll(socket)
7476
if err != nil {
7577
return err

pkg/guestagent/guestagent.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package guestagent
55

66
import (
77
"context"
8+
"io"
89

910
"github.com/lima-vm/lima/v2/pkg/guestagent/api"
1011
)
@@ -14,4 +15,5 @@ type Agent interface {
1415
Events(ctx context.Context, ch chan *api.Event)
1516
LocalPorts(ctx context.Context) ([]*api.IPPort, error)
1617
HandleInotify(event *api.Inotify)
18+
io.Closer
1719
}

pkg/guestagent/guestagent_linux.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@ import (
2020
)
2121

2222
func New(ctx context.Context, ticker ticker.Ticker) (Agent, error) {
23+
socketsLister, err := sockets.NewLister()
24+
if err != nil {
25+
return nil, err
26+
}
2327
a := &agent{
2428
ticker: ticker,
29+
socketLister: socketsLister,
2530
kubernetesServiceWatcher: kubernetesservice.NewServiceWatcher(),
2631
}
2732

@@ -35,8 +40,8 @@ type agent struct {
3540
// Ticker is like time.Ticker.
3641
// We can't use inotify for /proc/net/tcp, so we need this ticker to
3742
// reload /proc/net/tcp.
38-
ticker ticker.Ticker
39-
43+
ticker ticker.Ticker
44+
socketLister *sockets.Lister
4045
kubernetesServiceWatcher *kubernetesservice.ServiceWatcher
4146
}
4247

@@ -119,7 +124,7 @@ func (a *agent) Events(ctx context.Context, ch chan *api.Event) {
119124

120125
func (a *agent) LocalPorts(_ context.Context) ([]*api.IPPort, error) {
121126
var res []*api.IPPort
122-
socketsList, err := sockets.List()
127+
socketsList, err := a.socketLister.List()
123128
if err != nil {
124129
return res, err
125130
}
@@ -227,3 +232,12 @@ func (a *agent) HandleInotify(event *api.Inotify) {
227232
}
228233
}
229234
}
235+
236+
func (a *agent) Close() error {
237+
if a.socketLister != nil {
238+
if err := a.socketLister.Close(); err != nil {
239+
return err
240+
}
241+
}
242+
return nil
243+
}

pkg/guestagent/sockets/sockets_linux.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,26 @@ func parseMessages(msgs []netlink.Message, proto int) ([]Socket, error) {
9797
return sockets, nil
9898
}
9999

100-
func List() ([]Socket, error) {
101-
// open NETLINK_INET_DIAG once and reuse
102-
var sockets []Socket
100+
func NewLister() (*Lister, error) {
103101
conn, err := netlink.Dial(unix.NETLINK_SOCK_DIAG, nil)
104102
if err != nil {
105-
return sockets, fmt.Errorf("failed to open netlink connection: %w", err)
103+
return nil, fmt.Errorf("failed to open netlink connection: %w", err)
106104
}
107-
defer conn.Close()
105+
return &Lister{conn: conn}, nil
106+
}
107+
108+
type Lister struct {
109+
conn *netlink.Conn
110+
}
108111

112+
func (lister *Lister) List() ([]Socket, error) {
109113
protos := []int{unix.IPPROTO_TCP, unix.IPPROTO_UDP}
110114
families := []int{unix.AF_INET, unix.AF_INET6}
111115

116+
var sockets []Socket
112117
for _, proto := range protos {
113118
for _, fam := range families {
114-
msgs, err := query(conn, fam, proto)
119+
msgs, err := query(lister.conn, fam, proto)
115120
if err != nil {
116121
continue
117122
}
@@ -124,3 +129,7 @@ func List() ([]Socket, error) {
124129
}
125130
return sockets, nil
126131
}
132+
133+
func (lister *Lister) Close() error {
134+
return lister.conn.Close()
135+
}

pkg/guestagent/sockets/sockets_linux_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,10 @@ func TestParseMessages_ShortDataSkipped(t *testing.T) {
104104
}
105105

106106
func TestListS_Integration(t *testing.T) {
107-
_, err := List()
107+
lister, err := NewLister()
108+
assert.NilError(t, err, "NewLister error")
109+
defer lister.Close()
110+
_, err = lister.List()
108111
if err != nil {
109112
t.Skipf("skipping: cannot query netlink inet_diag (%v)", err)
110113
}

0 commit comments

Comments
 (0)