diff --git a/api/server/init.go b/api/server/init.go index 2d2214565..c64d8f176 100644 --- a/api/server/init.go +++ b/api/server/init.go @@ -41,7 +41,7 @@ func init() { } } -func contextWithSignal(ctx context.Context, signals ...os.Signal) context.Context { +func contextWithSignal(ctx context.Context, signals ...os.Signal) (context.Context, context.CancelFunc) { newCTX, halt := context.WithCancel(ctx) c := make(chan os.Signal, 1) signal.Notify(c, signals...) @@ -59,5 +59,5 @@ func contextWithSignal(ctx context.Context, signals ...os.Signal) context.Contex } } }() - return newCTX + return newCTX, halt } diff --git a/api/server/server.go b/api/server/server.go index d3dc7a502..4ff4a82b1 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -254,11 +254,11 @@ func extractFields(c *gin.Context) logrus.Fields { } func (s *Server) Start(ctx context.Context) { - ctx = contextWithSignal(ctx, os.Interrupt) - s.startGears(ctx) + newctx, cancel := contextWithSignal(ctx, os.Interrupt) + s.startGears(newctx, cancel) } -func (s *Server) startGears(ctx context.Context) { +func (s *Server) startGears(ctx context.Context, cancel context.CancelFunc) { // By default it serves on :8080 unless a // PORT environment variable was defined. listen := fmt.Sprintf(":%d", viper.GetInt(EnvPort)) @@ -281,13 +281,21 @@ func (s *Server) startGears(ctx context.Context) { } go func() { - <-ctx.Done() // listening for signals... - server.Shutdown(context.Background()) // we can wait + err := server.ListenAndServe() + if err != nil && err != http.ErrServerClosed { + logrus.WithError(err).Error("server error") + cancel() + } else { + logrus.Info("server stopped") + } }() - err := server.ListenAndServe() - if err != nil { - logrus.WithError(err).Error("error opening server") + // listening for signals or listener errors... + <-ctx.Done() + + // TODO: do not wait forever during graceful shutdown (add graceful shutdown timeout) + if err := server.Shutdown(context.Background()); err != nil { + logrus.WithError(err).Error("server shutdown error") } s.Agent.Close() // after we stop taking requests, wait for all tasks to finish