Skip to content

Commit f965dfe

Browse files
authored
Shutdown metrics server when listener exits (#3445)
1 parent 4ee49fe commit f965dfe

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

Diff for: cmd/ghalistener/app/app.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,19 @@ func (app *App) Run(ctx context.Context) error {
117117
}
118118

119119
g, ctx := errgroup.WithContext(ctx)
120+
metricsCtx, cancelMetrics := context.WithCancelCause(ctx)
121+
120122
g.Go(func() error {
121123
app.logger.Info("Starting listener")
122-
return app.listener.Listen(ctx, app.worker)
124+
listnerErr := app.listener.Listen(ctx, app.worker)
125+
cancelMetrics(fmt.Errorf("Listener exited: %w", listnerErr))
126+
return listnerErr
123127
})
124128

125129
if app.metrics != nil {
126130
g.Go(func() error {
127131
app.logger.Info("Starting metrics server")
128-
return app.metrics.ListenAndServe(ctx)
132+
return app.metrics.ListenAndServe(metricsCtx)
129133
})
130134
}
131135

Diff for: cmd/ghalistener/listener/listener.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ func (l *Listener) Listen(ctx context.Context, handler Handler) error {
174174
continue
175175
}
176176

177-
// New context is created to avoid cancelation during message handling.
178-
if err := l.handleMessage(context.Background(), handler, msg); err != nil {
177+
// Remove cancellation from the context to avoid cancelling the message handling.
178+
if err := l.handleMessage(context.WithoutCancel(ctx), handler, msg); err != nil {
179179
return fmt.Errorf("failed to handle message: %w", err)
180180
}
181181
}

Diff for: cmd/ghalistener/listener/listener_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,8 @@ func TestListener_Listen(t *testing.T) {
484484
).
485485
Once()
486486

487-
// Ensure delete message is called with background context
488-
client.On("DeleteMessage", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()
487+
// Ensure delete message is called without cancel
488+
client.On("DeleteMessage", context.WithoutCancel(ctx), mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()
489489

490490
config.Client = client
491491

Diff for: cmd/ghalistener/metrics/metrics.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"net/http"
66
"strconv"
7+
"time"
78

89
"github.com/actions/actions-runner-controller/github/actions"
910
"github.com/go-logr/logr"
@@ -338,7 +339,9 @@ func (e *exporter) ListenAndServe(ctx context.Context) error {
338339
e.logger.Info("starting metrics server", "addr", e.srv.Addr)
339340
go func() {
340341
<-ctx.Done()
341-
e.logger.Info("stopping metrics server")
342+
e.logger.Info("stopping metrics server", "err", ctx.Err())
343+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
344+
defer cancel()
342345
e.srv.Shutdown(ctx)
343346
}()
344347
return e.srv.ListenAndServe()

0 commit comments

Comments
 (0)