Commit 367d2857 authored by Erik Wilson's avatar Erik Wilson Committed by corbot[bot]

plugin/reload: Graceful reload of imported files (#3068)

Automatically submitted.
parent 4fda9535
...@@ -89,8 +89,9 @@ closed in step 1; so the health endpoint is broken. The same can hopen in the pr ...@@ -89,8 +89,9 @@ closed in step 1; so the health endpoint is broken. The same can hopen in the pr
In general be careful with assigning new port and expecting reload to work fully. In general be careful with assigning new port and expecting reload to work fully.
Also any `import` statement is not discovered by this plugin. This means if any of these imported files In CoreDNS v1.6.0 and earlier any `import` statements are not discovered by this plugin.
changes the *reload* plugin is ignorant of that fact. This means if any of these imported files changes the *reload* plugin is ignorant of that fact.
CoreDNS v1.7.0 and later does parse the Corefile and supports detecting changes in imported files.
## Metrics ## Metrics
......
package reload package reload
import ( import (
"bytes"
"crypto/md5" "crypto/md5"
"encoding/json"
"sync" "sync"
"time" "time"
"github.com/caddyserver/caddy" "github.com/caddyserver/caddy"
"github.com/caddyserver/caddy/caddyfile"
) )
// reload periodically checks if the Corefile has changed, and reloads if so // reload periodically checks if the Corefile has changed, and reloads if so
...@@ -46,6 +49,14 @@ func (r *reload) interval() time.Duration { ...@@ -46,6 +49,14 @@ func (r *reload) interval() time.Duration {
return r.dur return r.dur
} }
func parse(corefile caddy.Input) ([]byte, error) {
serverBlocks, err := caddyfile.Parse(corefile.Path(), bytes.NewReader(corefile.Body()), nil)
if err != nil {
return nil, err
}
return json.Marshal(serverBlocks)
}
func hook(event caddy.EventName, info interface{}) error { func hook(event caddy.EventName, info interface{}) error {
if event != caddy.InstanceStartupEvent { if event != caddy.InstanceStartupEvent {
return nil return nil
...@@ -60,7 +71,12 @@ func hook(event caddy.EventName, info interface{}) error { ...@@ -60,7 +71,12 @@ func hook(event caddy.EventName, info interface{}) error {
// this should be an instance. ok to panic if not // this should be an instance. ok to panic if not
instance := info.(*caddy.Instance) instance := info.(*caddy.Instance)
md5sum := md5.Sum(instance.Caddyfile().Body()) parsedCorefile, err := parse(instance.Caddyfile())
if err != nil {
return err
}
md5sum := md5.Sum(parsedCorefile)
log.Infof("Running configuration MD5 = %x\n", md5sum) log.Infof("Running configuration MD5 = %x\n", md5sum)
go func() { go func() {
...@@ -73,7 +89,12 @@ func hook(event caddy.EventName, info interface{}) error { ...@@ -73,7 +89,12 @@ func hook(event caddy.EventName, info interface{}) error {
if err != nil { if err != nil {
continue continue
} }
s := md5.Sum(corefile.Body()) parsedCorefile, err := parse(corefile)
if err != nil {
log.Warningf("Corefile parse failed: %s", err)
continue
}
s := md5.Sum(parsedCorefile)
if s != md5sum { if s != md5sum {
// Let not try to restart with the same file, even though it is wrong. // Let not try to restart with the same file, even though it is wrong.
md5sum = s md5sum = s
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment