Skip to content

Commit fef24e5

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 028fea1 commit fef24e5

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
@@ -463,26 +463,19 @@ func (a *HostAgent) startRoutinesAndWait(ctx context.Context, errCh <-chan error
463463
stRunning.Running = true
464464
a.emitEvent(ctx, events.Event{Status: stRunning})
465465
}()
466-
for {
467-
select {
468-
case driverErr := <-errCh:
469-
logrus.Infof("Driver stopped due to error: %q", driverErr)
470-
cancelHA()
471-
if closeErr := a.close(); closeErr != nil {
472-
logrus.WithError(closeErr).Warn("an error during shutting down the host agent")
473-
}
474-
err := a.driver.Stop(ctx)
475-
return err
476-
case sig := <-a.signalCh:
477-
logrus.Infof("Received %s, shutting down the host agent", osutil.SignalName(sig))
478-
cancelHA()
479-
if closeErr := a.close(); closeErr != nil {
480-
logrus.WithError(closeErr).Warn("an error during shutting down the host agent")
481-
}
482-
err := a.driver.Stop(ctx)
483-
return err
484-
}
485-
}
466+
// wait for either the driver to stop or a signal to shut down
467+
select {
468+
case driverErr := <-errCh:
469+
logrus.Infof("Driver stopped due to error: %q", driverErr)
470+
case sig := <-a.signalCh:
471+
logrus.Infof("Received %s, shutting down the host agent", osutil.SignalName(sig))
472+
}
473+
// close the host agent routines before cancelling the context
474+
if closeErr := a.close(); closeErr != nil {
475+
logrus.WithError(closeErr).Warn("an error during shutting down the host agent")
476+
}
477+
cancelHA()
478+
return a.driver.Stop(ctx)
486479
}
487480

488481
func (a *HostAgent) Info(_ context.Context) (*hostagentapi.Info, error) {
@@ -618,6 +611,7 @@ sudo chown -R "${USER}" /run/host-services`
618611
}
619612

620613
// cleanUp registers a cleanup function to be called when the host agent is stopped.
614+
// The cleanup functions are called before the context is cancelled, in the reverse order of their registration.
621615
func (a *HostAgent) cleanUp(fn func() error) {
622616
a.onCloseMu.Lock()
623617
defer a.onCloseMu.Unlock()
@@ -689,6 +683,9 @@ func (a *HostAgent) watchGuestAgentEvents(ctx context.Context) {
689683
}
690684
}()
691685

686+
// ensure close before ctx is cancelled
687+
a.cleanUp(a.grpcPortForwarder.Close)
688+
692689
for {
693690
if a.client == nil || !isGuestAgentSocketAccessible(ctx, a.client) {
694691
if a.driver.ForwardGuestAgent() {
@@ -821,7 +818,6 @@ func (a *HostAgent) processGuestAgentEvents(ctx context.Context, client *guestag
821818
a.grpcPortForwarder.OnEvent(ctx, client, ev)
822819
}
823820
}
824-
defer a.grpcPortForwarder.Close()
825821

826822
if err := client.Events(ctx, onEvent); err != nil {
827823
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)