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)
+	}
 }