mirror of
https://github.com/coredns/coredns.git
synced 2025-11-02 02:03:13 -05:00
Make middleware survive a restart (#142)
Make middleware that sets up a (http) handler survive a graceful restart. We calls the middleware's Shutdown function(s). If restart fails the Start function is called again. * middleware/health: OK * middleware/pprof: OK * middleware/metrics: OK All restart OK.
This commit is contained in:
@@ -3,6 +3,7 @@ package health
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"sync"
|
||||
)
|
||||
@@ -11,28 +12,45 @@ var once sync.Once
|
||||
|
||||
type Health struct {
|
||||
Addr string
|
||||
ln net.Listener
|
||||
mux *http.ServeMux
|
||||
}
|
||||
|
||||
func health(w http.ResponseWriter, r *http.Request) {
|
||||
io.WriteString(w, ok)
|
||||
}
|
||||
|
||||
func (h Health) ListenAndServe() error {
|
||||
func (h *Health) Start() error {
|
||||
if h.Addr == "" {
|
||||
h.Addr = defAddr
|
||||
}
|
||||
|
||||
once.Do(func() {
|
||||
http.HandleFunc("/health", health)
|
||||
if ln, err := net.Listen("tcp", h.Addr); err != nil {
|
||||
log.Printf("[ERROR] Failed to start health handler: %s", err)
|
||||
return
|
||||
} else {
|
||||
h.ln = ln
|
||||
}
|
||||
h.mux = http.NewServeMux()
|
||||
|
||||
h.mux.HandleFunc(path, health)
|
||||
go func() {
|
||||
if err := http.ListenAndServe(h.Addr, nil); err != nil {
|
||||
log.Printf("[ERROR] Failed to start health handler: %s", err)
|
||||
}
|
||||
http.Serve(h.ln, h.mux)
|
||||
}()
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Health) Shutdown() error {
|
||||
if h.ln != nil {
|
||||
return h.ln.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
const (
|
||||
ok = "OK"
|
||||
defAddr = ":8080"
|
||||
path = "/health"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user