From 6cf0569b935e1c292f2e23480eb7e18bf214802d Mon Sep 17 00:00:00 2001 From: toim Date: Thu, 12 Feb 2026 09:07:41 +0200 Subject: [PATCH] Graceful shutdown: http.Serve needs to wait for graceful shutdown goroutine to finish. Fixes #2897 --- server.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/server.go b/server.go index 509cd8975..74c2383c6 100644 --- a/server.go +++ b/server.go @@ -13,6 +13,7 @@ import ( "net" "net/http" "os" + "sync" "time" ) @@ -139,10 +140,18 @@ func (sc StartConfig) start(ctx stdContext.Context, h http.Handler) error { logger.Info("http(s) server started", "address", listener.Addr().String()) } + wg := sync.WaitGroup{} + defer wg.Wait() // wait for graceful shutdown goroutine to finish + + gCtx, cancel := stdContext.WithCancel(ctx) // end graceful goroutine when Serve returns early + defer cancel() + if sc.GracefulTimeout >= 0 { - gCtx, cancel := stdContext.WithCancel(ctx) // end goroutine when Serve returns early - defer cancel() - go gracefulShutdown(gCtx, &sc, &server, logger) + wg.Add(1) + go func() { + defer wg.Done() + gracefulShutdown(gCtx, &sc, &server, logger) + }() } if err := server.Serve(listener); err != nil && !errors.Is(err, http.ErrServerClosed) {