Skip to content

Commit 6c5ee21

Browse files
authored
Merge pull request #4031 from norio-nomura/close-grpc-forwarder
`portfwd`: close `ClosableListeners` on exit
2 parents 117f536 + 729b200 commit 6c5ee21

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

pkg/hostagent/hostagent.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,7 @@ func (a *HostAgent) processGuestAgentEvents(ctx context.Context, client *guestag
789789
a.grpcPortForwarder.OnEvent(ctx, client, ev)
790790
}
791791
}
792+
defer a.grpcPortForwarder.Close()
792793

793794
if err := client.Events(ctx, onEvent); err != nil {
794795
if status.Code(err) == codes.Canceled {

pkg/portfwd/forward.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ func NewPortForwarder(rules []limatype.PortForward, ignoreTCP, ignoreUDP bool) *
3434
}
3535
}
3636

37+
func (fw *Forwarder) Close() {
38+
fw.closableListeners.Close()
39+
}
40+
3741
func (fw *Forwarder) OnEvent(ctx context.Context, client *guestagentclient.GuestAgentClient, ev *api.Event) {
3842
for _, f := range ev.AddedLocalPorts {
3943
// Before forwarding, check if any static rule matches this port otherwise it will be forwarded twice and cause a port conflict

pkg/portfwd/listener.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,21 @@ func NewClosableListener() *ClosableListeners {
3535
}
3636
}
3737

38+
func (p *ClosableListeners) Close() {
39+
p.listenersRW.Lock()
40+
defer p.listenersRW.Unlock()
41+
for _, listener := range p.listeners {
42+
listener.Close()
43+
}
44+
clear(p.listeners)
45+
p.udpListenersRW.Lock()
46+
defer p.udpListenersRW.Unlock()
47+
for _, listener := range p.udpListeners {
48+
listener.Close()
49+
}
50+
clear(p.udpListeners)
51+
}
52+
3853
func (p *ClosableListeners) Forward(ctx context.Context, client *guestagentclient.GuestAgentClient,
3954
protocol string, hostAddress string, guestAddress string,
4055
) {
@@ -90,6 +105,9 @@ func (p *ClosableListeners) forwardTCP(ctx context.Context, client *guestagentcl
90105
for {
91106
conn, err := tcpLis.Accept()
92107
if err != nil {
108+
if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "use of closed network connection" {
109+
return
110+
}
93111
logrus.Errorf("failed to accept TCP connection: %v", err)
94112
if strings.Contains(err.Error(), "pseudoloopback") {
95113
// don't stop forwarding because the forwarder has rejected a non-local address

0 commit comments

Comments
 (0)