func fillSettings(settings map[string]interface{}, srvr *server.Server) map[string]interface{} { settings[_CPUPROFILE] = srvr.CpuProfile() settings[_MEMPROFILE] = srvr.MemProfile() settings[_SERVICERS] = srvr.Servicers() settings[_SCANCAP] = srvr.ScanCap() settings[_REQUESTSIZECAP] = srvr.RequestSizeCap() settings[_DEBUG] = srvr.Debug() settings[_PIPELINEBATCH] = srvr.PipelineBatch() settings[_PIPELINECAP] = srvr.PipelineCap() settings[_MAXPARALLELISM] = srvr.MaxParallelism() settings[_TIMEOUT] = srvr.Timeout() settings[_KEEPALIVELENGTH] = srvr.KeepAlive() settings[_LOGLEVEL] = srvr.LogLevel() return settings }
// signalCatcher blocks until a signal is recieved and then takes appropriate action func signalCatcher(server *server.Server, endpoint *http.HttpEndpoint) { sig_chan := make(chan os.Signal, 4) signal.Notify(sig_chan, os.Interrupt, syscall.SIGTERM) var s os.Signal select { case s = <-sig_chan: } if server.CpuProfile() != "" { logging.Infop("Stopping CPU profile") pprof.StopCPUProfile() } if server.MemProfile() != "" { f, err := os.Create(server.MemProfile()) if err != nil { logging.Errorp("Cannot create memory profile file", logging.Pair{"error", err}) } else { logging.Infop("Writing Memory profile") pprof.WriteHeapProfile(f) f.Close() } } if s == os.Interrupt { // Interrupt (ctrl-C) => Immediate (ungraceful) exit logging.Infop("Shutting down immediately") os.Exit(0) } logging.Infop("Attempting graceful exit") // Stop accepting new requests err := endpoint.Close() if err != nil { logging.Errorp("error closing http listener", logging.Pair{"err", err}) } err = endpoint.CloseTLS() if err != nil { logging.Errorp("error closing https listener", logging.Pair{"err", err}) } }