2770: terminate on SIGTERM.
authorTim Pierce <twp@curoverse.com>
Fri, 16 May 2014 19:29:31 +0000 (15:29 -0400)
committerTim Pierce <twp@curoverse.com>
Fri, 16 May 2014 19:29:31 +0000 (15:29 -0400)
When SIGTERM is received, the Keep server shuts down gracefully. (refs #2770)

services/keep/src/keep/keep.go

index 7c4173707a7e4ea87e8c0892d047ba1b542e7faf..59396ad188a72c253f22b7de316cca6e4e1c12d5 100644 (file)
@@ -12,8 +12,10 @@ import (
        "io"
        "io/ioutil"
        "log"
+       "net"
        "net/http"
        "os"
+       "os/signal"
        "regexp"
        "strconv"
        "strings"
@@ -93,6 +95,8 @@ var ReadErrorTooLong = errors.New("Too long")
 // permission arguments).
 
 func main() {
+       log.Println("Keep started: pid", os.Getpid())
+
        // Parse command-line flags:
        //
        // -listen=ipaddr:port
@@ -235,8 +239,27 @@ func main() {
        // router.
        http.Handle("/", MakeRESTRouter())
 
+       // Set up a TCP listener.
+       listener, err := net.Listen("tcp", listen)
+       if err != nil {
+               log.Fatal(err)
+       }
+
+       // Shut down the server gracefully (by closing the listener)
+       // if SIGTERM is received.
+       term := make(chan os.Signal, 1)
+       go func(sig <-chan os.Signal) {
+               s := <-sig
+               log.Println("caught signal:", s)
+               listener.Close()
+       }(term)
+       signal.Notify(term, syscall.SIGTERM)
+
        // Start listening for requests.
-       http.ListenAndServe(listen, nil)
+       srv := &http.Server{Addr: listen}
+       srv.Serve(listener)
+
+       log.Println("shutting down")
 }
 
 // MakeRESTRouter