From a46e10269a3d4e7e3a3e56763a0ed73d1729695f Mon Sep 17 00:00:00 2001 From: peusebiu Date: Sat, 6 Jan 2024 03:50:48 +0200 Subject: [PATCH] fix(shutdown): fix crash when shutting down before server and task scheduler have started. (#2148) init shutdown routine after controller.Init() check for nil values before stopping http server and task scheduler. Signed-off-by: Petu Eusebiu --- pkg/api/controller.go | 11 ++++++++--- pkg/cli/server/config_reloader.go | 4 ---- pkg/cli/server/root.go | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pkg/api/controller.go b/pkg/api/controller.go index fda220f5..7e3b7e93 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -370,13 +370,18 @@ func (c *Controller) LoadNewConfig(newConfig *config.Config) { func (c *Controller) Shutdown() { c.StopBackgroundTasks() - ctx := context.Background() - _ = c.Server.Shutdown(ctx) + + if c.Server != nil { + ctx := context.Background() + _ = c.Server.Shutdown(ctx) + } } // Will stop scheduler and wait for all tasks to finish their work. func (c *Controller) StopBackgroundTasks() { - c.taskScheduler.Shutdown() + if c.taskScheduler != nil { + c.taskScheduler.Shutdown() + } } func (c *Controller) StartBackgroundTasks() { diff --git a/pkg/cli/server/config_reloader.go b/pkg/cli/server/config_reloader.go index 43967a27..bf57ffa7 100644 --- a/pkg/cli/server/config_reloader.go +++ b/pkg/cli/server/config_reloader.go @@ -41,8 +41,6 @@ func signalHandler(ctlr *api.Controller, sigCh chan os.Signal) { // gracefully shutdown http server ctlr.Shutdown() //nolint: contextcheck - - close(sigCh) } } @@ -61,8 +59,6 @@ func initShutDownRoutine(ctlr *api.Controller) { func (hr *HotReloader) Start() { done := make(chan bool) - initShutDownRoutine(hr.ctlr) - // run watcher go func() { defer hr.watcher.Close() diff --git a/pkg/cli/server/root.go b/pkg/cli/server/root.go index afdc1d15..2a4e8d42 100644 --- a/pkg/cli/server/root.go +++ b/pkg/cli/server/root.go @@ -69,6 +69,8 @@ func newServeCmd(conf *config.Config) *cobra.Command { return err } + initShutDownRoutine(ctlr) + if err := ctlr.Run(); err != nil { log.Error().Err(err).Msg("failed to start controller, exiting") }