mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04: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:
		| @@ -2,8 +2,9 @@ package pprof | ||||
|  | ||||
| import ( | ||||
| 	"log" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	_ "net/http/pprof" | ||||
| 	pp "net/http/pprof" | ||||
|  | ||||
| 	"github.com/miekg/coredns/middleware" | ||||
|  | ||||
| @@ -11,10 +12,10 @@ import ( | ||||
| 	"golang.org/x/net/context" | ||||
| ) | ||||
|  | ||||
| const addr = "localhost:8053" | ||||
|  | ||||
| type Handler struct { | ||||
| 	Next middleware.Handler | ||||
| 	ln   net.Listener | ||||
| 	mux  *http.ServeMux | ||||
| } | ||||
|  | ||||
| // ServeDNS passes all other requests up the chain. | ||||
| @@ -23,10 +24,34 @@ func (h *Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg | ||||
| } | ||||
|  | ||||
| func (h *Handler) Start() error { | ||||
| 	if ln, err := net.Listen("tcp", addr); err != nil { | ||||
| 		log.Printf("[ERROR] Failed to start pprof handler: %s", err) | ||||
| 		return err | ||||
| 	} else { | ||||
| 		h.ln = ln | ||||
| 	} | ||||
|  | ||||
| 	h.mux = http.NewServeMux() | ||||
| 	h.mux.HandleFunc(path+"/", pp.Index) | ||||
| 	h.mux.HandleFunc(path+"/cmdline", pp.Cmdline) | ||||
| 	h.mux.HandleFunc(path+"/profile", pp.Profile) | ||||
| 	h.mux.HandleFunc(path+"/symbol", pp.Symbol) | ||||
| 	h.mux.HandleFunc(path+"/trace", pp.Trace) | ||||
|  | ||||
| 	go func() { | ||||
| 		if err := http.ListenAndServe(addr, nil); err != nil { | ||||
| 			log.Printf("[ERROR] Failed to start pprof handler: %s", err) | ||||
| 		} | ||||
| 		http.Serve(h.ln, h.mux) | ||||
| 	}() | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (h *Handler) Shutdown() error { | ||||
| 	if h.ln != nil { | ||||
| 		return h.ln.Close() | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	addr = "localhost:6053" | ||||
| 	path = "/debug/pprof" | ||||
| ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user