mirror of
https://github.com/coredns/coredns.git
synced 2025-11-02 02:03:13 -05:00
Reloading caddy won't kill the health handler. Only on final shutdown we stop the handler. Currently when reloading CoreDNS with -SIGUSR1 the health handler stops answering - there is a test for this but it doesn't capture whole process reloading, sadly. This PR keeps the handler alive during reloads and only stops on process shutdown.
74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package health
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/coredns/coredns/core/dnsserver"
|
|
"github.com/coredns/coredns/middleware"
|
|
|
|
"github.com/mholt/caddy"
|
|
)
|
|
|
|
func init() {
|
|
caddy.RegisterPlugin("health", caddy.Plugin{
|
|
ServerType: "dns",
|
|
Action: setup,
|
|
})
|
|
}
|
|
|
|
func setup(c *caddy.Controller) error {
|
|
addr, err := healthParse(c)
|
|
if err != nil {
|
|
return middleware.Error("health", err)
|
|
}
|
|
|
|
h := &health{Addr: addr}
|
|
|
|
c.OnStartup(func() error {
|
|
for he := range healthers {
|
|
m := dnsserver.GetConfig(c).Handler(he)
|
|
if x, ok := m.(Healther); ok {
|
|
h.h = append(h.h, x)
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
|
|
c.OnStartup(func() error {
|
|
h.poll()
|
|
go func() {
|
|
for {
|
|
<-time.After(1 * time.Second)
|
|
h.poll()
|
|
}
|
|
}()
|
|
return nil
|
|
})
|
|
|
|
c.OnStartup(h.Startup)
|
|
c.OnFinalShutdown(h.Shutdown)
|
|
|
|
// Don't do AddMiddleware, as health is not *really* a middleware just a separate webserver running.
|
|
return nil
|
|
}
|
|
|
|
func healthParse(c *caddy.Controller) (string, error) {
|
|
addr := ""
|
|
for c.Next() {
|
|
args := c.RemainingArgs()
|
|
|
|
switch len(args) {
|
|
case 0:
|
|
case 1:
|
|
addr = args[0]
|
|
if _, _, e := net.SplitHostPort(addr); e != nil {
|
|
return "", e
|
|
}
|
|
default:
|
|
return "", c.ArgErr()
|
|
}
|
|
}
|
|
return addr, nil
|
|
}
|