Commit cf871b12 by bergquist

http: close http server gracefully.

parent 52566376
...@@ -25,6 +25,8 @@ type HttpServer struct { ...@@ -25,6 +25,8 @@ type HttpServer struct {
macaron *macaron.Macaron macaron *macaron.Macaron
context context.Context context context.Context
streamManager *live.StreamManager streamManager *live.StreamManager
httpSrv *http.Server
} }
func NewHttpServer() *HttpServer { func NewHttpServer() *HttpServer {
...@@ -46,11 +48,20 @@ func (hs *HttpServer) Start(ctx context.Context) error { ...@@ -46,11 +48,20 @@ func (hs *HttpServer) Start(ctx context.Context) error {
listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort) listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
hs.log.Info("Initializing HTTP Server", "address", listenAddr, "protocol", setting.Protocol, "subUrl", setting.AppSubUrl) hs.log.Info("Initializing HTTP Server", "address", listenAddr, "protocol", setting.Protocol, "subUrl", setting.AppSubUrl)
hs.httpSrv = &http.Server{Addr: listenAddr, Handler: hs.macaron}
switch setting.Protocol { switch setting.Protocol {
case setting.HTTP: case setting.HTTP:
err = http.ListenAndServe(listenAddr, hs.macaron) err = hs.httpSrv.ListenAndServe()
if err == http.ErrServerClosed {
hs.log.Debug("server was shutdown gracefully")
return nil
}
case setting.HTTPS: case setting.HTTPS:
err = hs.listenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile) err = hs.httpSrv.ListenAndServeTLS(setting.CertFile, setting.KeyFile)
if err == http.ErrServerClosed {
hs.log.Debug("server was shutdown gracefully")
return nil
}
default: default:
hs.log.Error("Invalid protocol", "protocol", setting.Protocol) hs.log.Error("Invalid protocol", "protocol", setting.Protocol)
err = errors.New("Invalid Protocol") err = errors.New("Invalid Protocol")
...@@ -59,6 +70,12 @@ func (hs *HttpServer) Start(ctx context.Context) error { ...@@ -59,6 +70,12 @@ func (hs *HttpServer) Start(ctx context.Context) error {
return err return err
} }
func (hs *HttpServer) Shutdown(ctx context.Context) error {
err := hs.httpSrv.Shutdown(ctx)
hs.log.Info("stopped http server")
return err
}
func (hs *HttpServer) listenAndServeTLS(listenAddr, certfile, keyfile string) error { func (hs *HttpServer) listenAndServeTLS(listenAddr, certfile, keyfile string) error {
if certfile == "" { if certfile == "" {
return fmt.Errorf("cert_file cannot be empty when using HTTPS") return fmt.Errorf("cert_file cannot be empty when using HTTPS")
......
...@@ -3,7 +3,6 @@ package main ...@@ -3,7 +3,6 @@ package main
import ( import (
"context" "context"
"os" "os"
"time"
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
...@@ -39,6 +38,8 @@ type GrafanaServerImpl struct { ...@@ -39,6 +38,8 @@ type GrafanaServerImpl struct {
shutdownFn context.CancelFunc shutdownFn context.CancelFunc
childRoutines *errgroup.Group childRoutines *errgroup.Group
log log.Logger log log.Logger
httpServer *api.HttpServer
} }
func (g *GrafanaServerImpl) Start() { func (g *GrafanaServerImpl) Start() {
...@@ -74,9 +75,9 @@ func (g *GrafanaServerImpl) Start() { ...@@ -74,9 +75,9 @@ func (g *GrafanaServerImpl) Start() {
} }
func (g *GrafanaServerImpl) startHttpServer() { func (g *GrafanaServerImpl) startHttpServer() {
httpServer := api.NewHttpServer() g.httpServer = api.NewHttpServer()
err := httpServer.Start(g.context) err := g.httpServer.Start(g.context)
if err != nil { if err != nil {
g.log.Error("Fail to start server", "error", err) g.log.Error("Fail to start server", "error", err)
...@@ -88,8 +89,13 @@ func (g *GrafanaServerImpl) startHttpServer() { ...@@ -88,8 +89,13 @@ func (g *GrafanaServerImpl) startHttpServer() {
func (g *GrafanaServerImpl) Shutdown(code int, reason string) { func (g *GrafanaServerImpl) Shutdown(code int, reason string) {
g.log.Info("Shutdown started", "code", code, "reason", reason) g.log.Info("Shutdown started", "code", code, "reason", reason)
err := g.httpServer.Shutdown(g.context)
if err != nil {
g.log.Error("Failed to shutdown server", "error", err)
}
g.shutdownFn() g.shutdownFn()
err := g.childRoutines.Wait() err = g.childRoutines.Wait()
g.log.Info("Shutdown completed", "reason", err) g.log.Info("Shutdown completed", "reason", err)
log.Close() log.Close()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment