Merge branch 'master' into 2767-doc-updates
[arvados.git] / services / keep / src / keep / keep.go
index e01d45ca7cbe3de53799a798e5785ee4b0337f37..d65e4453f724cc86db6d025ed4ae94bd5302096c 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