Mercurial > gemma
changeset 151:3349bfc2a047
Shutdown server gracefully.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 02 Jul 2018 13:23:31 +0200 |
parents | 44a7e27a0816 |
children | a719a3ba2fb4 |
files | auth/connection.go auth/inmemory.go cmd/tokenserver/main.go |
diffstat | 3 files changed, 39 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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()
--- 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 +}
--- 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) + } }