# HG changeset patch # User Sascha L. Teichmann # Date 1530530611 -7200 # Node ID 3349bfc2a04732fc2b118003734fcc35d90ea7b3 # Parent 44a7e27a08160283440013cab5a43dcbe7f64f52 Shutdown server gracefully. diff -r 44a7e27a0816 -r 3349bfc2a047 auth/connection.go --- a/auth/connection.go Mon Jul 02 12:54:07 2018 +0200 +++ b/auth/connection.go Mon Jul 02 13:23:31 2018 +0200 @@ -16,6 +16,7 @@ Renew(token string) (string, error) Do(token string, fn func(*sql.DB) error) error Session(token string) *Session + Shutdown() error } var ConnPool ConnectionPool = NewInMemoryConnectionPool() diff -r 44a7e27a0816 -r 3349bfc2a047 auth/inmemory.go --- a/auth/inmemory.go Mon Jul 02 12:54:07 2018 +0200 +++ b/auth/inmemory.go Mon Jul 02 13:23:31 2018 +0200 @@ -2,6 +2,7 @@ import ( "database/sql" + "log" "time" ) @@ -198,3 +199,8 @@ } return <-res } + +func (cp *InMemoryConnectionPool) Shutdown() error { + log.Println("info: shutdown in-memory connection pool.") + return nil +} diff -r 44a7e27a0816 -r 3349bfc2a047 cmd/tokenserver/main.go --- a/cmd/tokenserver/main.go Mon Jul 02 12:54:07 2018 +0200 +++ b/cmd/tokenserver/main.go Mon Jul 02 13:23:31 2018 +0200 @@ -1,12 +1,16 @@ package main import ( + "context" "encoding/json" "flag" "fmt" "log" "net/http" + "os" + "os/signal" "path/filepath" + "syscall" "gemma.intevation.de/gemma/auth" ) @@ -104,5 +108,32 @@ auth.SessionChecker(http.HandlerFunc(sysAdmin), auth.HasRole("sys_admin")))) addr := fmt.Sprintf("%s:%d", *host, *port) - log.Fatalln(http.ListenAndServe(addr, mux)) + + server := http.Server{Addr: addr, Handler: mux} + + done := make(chan error) + + go func() { + defer close(done) + done <- server.ListenAndServe() + }() + + sigChan := make(chan os.Signal) + signal.Notify(sigChan, os.Interrupt, os.Kill, syscall.SIGTERM) + + select { + case err := <-done: + if err != nil && err != http.ErrServerClosed { + log.Fatalf("error: %v\n", err) + } + case <-sigChan: + } + + server.Shutdown(context.Background()) + + <-done + + if err := auth.ConnPool.Shutdown(); err != nil { + log.Fatalf("error: %v\n", err) + } }