aboutsummaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2019-06-09 08:10:15 +0100
committerGravatar GitHub <noreply@github.com> 2019-06-09 08:10:15 +0100
commita1c97f82a6f27ae1f4489a1dc5d0bc6fa4cce9ed (patch)
tree2d3e175189784fc2feca6e712c39dcbe82c4836a /plugin
parentbd83f74deb9e277ad5d101352a195cda548406c4 (diff)
downloadcoredns-a1c97f82a6f27ae1f4489a1dc5d0bc6fa4cce9ed.tar.gz
coredns-a1c97f82a6f27ae1f4489a1dc5d0bc6fa4cce9ed.tar.zst
coredns-a1c97f82a6f27ae1f4489a1dc5d0bc6fa4cce9ed.zip
plugin/ready: fix starts and restarts (#2814)
Add OnRestartFailed to the ready plugin and some various cleanups. Document slightly better how things are supposed to work with multiple `ready`'s in the multiple Server Blocks. All manually tested with this Corefile: ~~~ . { log ready } example.org { log chaos ready } ~~~ And then `kill -SIGUSR1` and curling the ready endpoint. This works well, the FailedReload is triggered by adding a syntax error in the Corefile. See #2659 Signed-off-by: Miek Gieben <miek@miek.nl>
Diffstat (limited to 'plugin')
-rw-r--r--plugin/pkg/uniq/uniq.go2
-rw-r--r--plugin/ready/README.md6
-rw-r--r--plugin/ready/ready.go8
-rw-r--r--plugin/ready/setup.go27
4 files changed, 20 insertions, 23 deletions
diff --git a/plugin/pkg/uniq/uniq.go b/plugin/pkg/uniq/uniq.go
index c3fdb5211..5f95e41d2 100644
--- a/plugin/pkg/uniq/uniq.go
+++ b/plugin/pkg/uniq/uniq.go
@@ -28,7 +28,7 @@ func (u U) Unset(key string) {
delete(u.u, key)
}
-// ForEach iterates for u executes f for each element that is 'todo' and sets it to 'done'.
+// ForEach iterates over u and executes f for each element that is 'todo' and sets it to 'done'.
func (u U) ForEach() error {
for k, v := range u.u {
if v.state == todo {
diff --git a/plugin/ready/README.md b/plugin/ready/README.md
index f5aa3cc22..d4a9bc5fe 100644
--- a/plugin/ready/README.md
+++ b/plugin/ready/README.md
@@ -12,7 +12,9 @@ body containing the list of plugins that are not ready. Once a plugin has signal
will not be queried again.
Each Server Block that enables the *ready* plugin will have the plugins *in that server block*
-report readiness into the /ready endpoint that runs on the same port.
+report readiness into the /ready endpoint that runs on the same port. This also means that the
+*same* plugin with different configurations (in potentialy *different* Server Blocks) will have
+their readiness reported as the union of their respective readinesses.
## Syntax
@@ -22,7 +24,7 @@ ready [ADDRESS]
*ready* optionally takes an address; the default is `:8181`. The path is fixed to `/ready`. The
readiness endpoint returns a 200 response code and the word "OK" when this server is ready. It
-returns a 503 otherwise.
+returns a 503 otherwise *and* the list of plugins that are not ready.
## Plugins
diff --git a/plugin/ready/ready.go b/plugin/ready/ready.go
index 692f3f81d..ff19b59f8 100644
--- a/plugin/ready/ready.go
+++ b/plugin/ready/ready.go
@@ -30,10 +30,6 @@ type ready struct {
}
func (rd *ready) onStartup() error {
- if rd.Addr == "" {
- rd.Addr = defAddr
- }
-
ln, err := net.Listen("tcp", rd.Addr)
if err != nil {
return err
@@ -62,8 +58,6 @@ func (rd *ready) onStartup() error {
return nil
}
-func (rd *ready) onRestart() error { return rd.onFinalShutdown() }
-
func (rd *ready) onFinalShutdown() error {
rd.Lock()
defer rd.Unlock()
@@ -77,5 +71,3 @@ func (rd *ready) onFinalShutdown() error {
rd.done = false
return nil
}
-
-const defAddr = ":8181"
diff --git a/plugin/ready/setup.go b/plugin/ready/setup.go
index 64967dbd4..7cf286b3d 100644
--- a/plugin/ready/setup.go
+++ b/plugin/ready/setup.go
@@ -21,22 +21,25 @@ func setup(c *caddy.Controller) error {
if err != nil {
return plugin.Error("ready", err)
}
-
rd := &ready{Addr: addr}
uniqAddr.Set(addr, rd.onStartup)
+ c.OnStartup(func() error { uniqAddr.Set(addr, rd.onStartup); return nil })
+ c.OnRestartFailed(func() error { uniqAddr.Set(addr, rd.onStartup); return nil })
- c.OncePerServerBlock(func() error {
- c.OnStartup(func() error {
- return uniqAddr.ForEach()
- })
- return nil
- })
+ c.OnStartup(func() error { return uniqAddr.ForEach() })
+ c.OnRestartFailed(func() error { return uniqAddr.ForEach() })
c.OnStartup(func() error {
- // Each plugin in this server block will (if they support it) report readiness.
- plugs := dnsserver.GetConfig(c).Handlers()
- for _, p := range plugs {
+ for _, p := range dnsserver.GetConfig(c).Handlers() {
+ if r, ok := p.(Readiness); ok {
+ plugins.Append(r, p.Name())
+ }
+ }
+ return nil
+ })
+ c.OnRestartFailed(func() error {
+ for _, p := range dnsserver.GetConfig(c).Handlers() {
if r, ok := p.(Readiness); ok {
plugins.Append(r, p.Name())
}
@@ -44,14 +47,14 @@ func setup(c *caddy.Controller) error {
return nil
})
- c.OnRestart(rd.onRestart)
+ c.OnRestart(rd.onFinalShutdown)
c.OnFinalShutdown(rd.onFinalShutdown)
return nil
}
func parse(c *caddy.Controller) (string, error) {
- addr := ""
+ addr := ":8181"
i := 0
for c.Next() {
if i > 0 {