Skip to content

Commit dfb49ee

Browse files
committed
pkg/hostagent: Ensure calling HostAgent.close() before cancelling the context.
portfwd: - Change `ClosableListeners.Close()` to return `error` - Change `Forwarder.Close()` to return `error` - Use `HostAgent.cleanUp()` instead of `defer` to calling `ClosableListeners.Close()` Signed-off-by: Norio Nomura <[email protected]>
1 parent 2beb888 commit dfb49ee

File tree

3 files changed

+28
-26
lines changed

3 files changed

+28
-26
lines changed

pkg/hostagent/hostagent.go

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -448,26 +448,19 @@ func (a *HostAgent) startRoutinesAndWait(ctx context.Context, errCh <-chan error
448448
stRunning.Running = true
449449
a.emitEvent(ctx, events.Event{Status: stRunning})
450450
}()
451-
for {
452-
select {
453-
case driverErr := <-errCh:
454-
logrus.Infof("Driver stopped due to error: %q", driverErr)
455-
cancelHA()
456-
if closeErr := a.close(); closeErr != nil {
457-
logrus.WithError(closeErr).Warn("an error during shutting down the host agent")
458-
}
459-
err := a.driver.Stop(ctx)
460-
return err
461-
case sig := <-a.signalCh:
462-
logrus.Infof("Received %s, shutting down the host agent", osutil.SignalName(sig))
463-
cancelHA()
464-
if closeErr := a.close(); closeErr != nil {
465-
logrus.WithError(closeErr).Warn("an error during shutting down the host agent")
466-
}
467-
err := a.driver.Stop(ctx)
468-
return err
469-
}
470-
}
451+
// wait for either the driver to stop or a signal to shut down
452+
select {
453+
case driverErr := <-errCh:
454+
logrus.Infof("Driver stopped due to error: %q", driverErr)
455+
case sig := <-a.signalCh:
456+
logrus.Infof("Received %s, shutting down the host agent", osutil.SignalName(sig))
457+
}
458+
// close the host agent routines before cancelling the context
459+
if closeErr := a.close(); closeErr != nil {
460+
logrus.WithError(closeErr).Warn("an error during shutting down the host agent")
461+
}
462+
cancelHA()
463+
return a.driver.Stop(ctx)
471464
}
472465

473466
func (a *HostAgent) Info(_ context.Context) (*hostagentapi.Info, error) {
@@ -603,6 +596,7 @@ sudo chown -R "${USER}" /run/host-services`
603596
}
604597

605598
// cleanUp registers a cleanup function to be called when the host agent is stopped.
599+
// The cleanup functions are called before the context is cancelled, in the reverse order of their registration.
606600
func (a *HostAgent) cleanUp(fn func() error) {
607601
a.onCloseMu.Lock()
608602
defer a.onCloseMu.Unlock()
@@ -674,6 +668,9 @@ func (a *HostAgent) watchGuestAgentEvents(ctx context.Context) {
674668
}
675669
}()
676670

671+
// ensure close before ctx is cancelled
672+
a.cleanUp(a.grpcPortForwarder.Close)
673+
677674
for {
678675
if a.client == nil || !isGuestAgentSocketAccessible(ctx, a.client) {
679676
if a.driver.ForwardGuestAgent() {
@@ -806,7 +803,6 @@ func (a *HostAgent) processGuestAgentEvents(ctx context.Context, client *guestag
806803
a.grpcPortForwarder.OnEvent(ctx, client, ev)
807804
}
808805
}
809-
defer a.grpcPortForwarder.Close()
810806

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

pkg/portfwd/forward.go

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

37-
func (fw *Forwarder) Close() {
38-
fw.closableListeners.Close()
37+
func (fw *Forwarder) Close() error {
38+
return fw.closableListeners.Close()
3939
}
4040

4141
func (fw *Forwarder) OnEvent(ctx context.Context, client *guestagentclient.GuestAgentClient, ev *api.Event) {

pkg/portfwd/listener.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,25 @@ func NewClosableListener() *ClosableListeners {
3838
}
3939
}
4040

41-
func (p *ClosableListeners) Close() {
41+
func (p *ClosableListeners) Close() error {
4242
p.listenersRW.Lock()
4343
defer p.listenersRW.Unlock()
44+
var errs []error
4445
for _, listener := range p.listeners {
45-
listener.Close()
46+
if err := listener.Close(); err != nil {
47+
errs = append(errs, err)
48+
}
4649
}
4750
clear(p.listeners)
4851
p.udpListenersRW.Lock()
4952
defer p.udpListenersRW.Unlock()
5053
for _, listener := range p.udpListeners {
51-
listener.Close()
54+
if err := listener.Close(); err != nil {
55+
errs = append(errs, err)
56+
}
5257
}
5358
clear(p.udpListeners)
59+
return errors.Join(errs...)
5460
}
5561

5662
func (p *ClosableListeners) Forward(ctx context.Context, client *guestagentclient.GuestAgentClient,

0 commit comments

Comments
 (0)