diff options
author | 2018-02-28 18:19:37 -0800 | |
---|---|---|
committer | 2018-02-28 18:19:37 -0800 | |
commit | 4f3dc207a46a29edd0f36b9242ce59a6c7e104d0 (patch) | |
tree | 698274f29cd2a7f911d9bd363d5e92ee01c0c5db | |
parent | 6bb08ffee446573c8f401160fa7830ffacca8530 (diff) | |
download | coredns-4f3dc207a46a29edd0f36b9242ce59a6c7e104d0.tar.gz coredns-4f3dc207a46a29edd0f36b9242ce59a6c7e104d0.tar.zst coredns-4f3dc207a46a29edd0f36b9242ce59a6c7e104d0.zip |
plugin/file: shutdown reload goroutine (#1571)
* plugin/file: shutdown reload goroutine
Shutdown the z.Reload() routine (if started in the first place) on
shutdow and reload.
Fixes #1508
* Must be put in c.OnShutdown()
* up test coverage
-rw-r--r-- | plugin/auto/zone.go | 4 | ||||
-rw-r--r-- | plugin/file/reload.go | 2 | ||||
-rw-r--r-- | plugin/file/setup.go | 4 | ||||
-rw-r--r-- | plugin/file/setup_test.go | 14 | ||||
-rw-r--r-- | plugin/file/shutdown.go | 9 | ||||
-rw-r--r-- | plugin/file/zone.go | 4 |
6 files changed, 32 insertions, 5 deletions
diff --git a/plugin/auto/zone.go b/plugin/auto/zone.go index e46f04e33..9839ad04d 100644 --- a/plugin/auto/zone.go +++ b/plugin/auto/zone.go @@ -60,8 +60,8 @@ func (z *Zones) Add(zo *file.Zone, name string) { func (z *Zones) Remove(name string) { z.Lock() - if zo, ok := z.Z[name]; ok && !zo.NoReload { - zo.ReloadShutdown <- true + if zo, ok := z.Z[name]; ok { + zo.OnShutdown() } delete(z.Z, name) diff --git a/plugin/file/reload.go b/plugin/file/reload.go index 53b57fd5e..5effae8eb 100644 --- a/plugin/file/reload.go +++ b/plugin/file/reload.go @@ -47,7 +47,7 @@ func (z *Zone) Reload() error { log.Printf("[INFO] Successfully reloaded zone %q in %q with serial %d", z.origin, z.file, z.Apex.SOA.Serial) z.Notify() - case <-z.ReloadShutdown: + case <-z.reloadShutdown: tick.Stop() return } diff --git a/plugin/file/setup.go b/plugin/file/setup.go index 5f55eebe3..6f83ea9f3 100644 --- a/plugin/file/setup.go +++ b/plugin/file/setup.go @@ -38,6 +38,10 @@ func setup(c *caddy.Controller) error { return nil }) } + for _, n := range zones.Names { + z := zones.Z[n] + c.OnShutdown(z.OnShutdown) + } dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { return File{Next: next, Zones: zones} diff --git a/plugin/file/setup_test.go b/plugin/file/setup_test.go index 62e8476f6..39cadaaf2 100644 --- a/plugin/file/setup_test.go +++ b/plugin/file/setup_test.go @@ -53,6 +53,20 @@ func TestFileParse(t *testing.T) { false, Zones{Names: []string{"10.in-addr.arpa."}}, }, + { + `file ` + zoneFileName1 + ` example.net. { + upstream a + }`, + true, + Zones{Names: []string{}}, + }, + { + `file ` + zoneFileName1 + ` example.net. { + no_rebloat + }`, + true, + Zones{Names: []string{}}, + }, } for i, test := range tests { diff --git a/plugin/file/shutdown.go b/plugin/file/shutdown.go new file mode 100644 index 000000000..cecd76e9e --- /dev/null +++ b/plugin/file/shutdown.go @@ -0,0 +1,9 @@ +package file + +// OnShutdown shuts down any running go-routines for this zone. +func (z *Zone) OnShutdown() error { + if !z.NoReload { + z.reloadShutdown <- true + } + return nil +} diff --git a/plugin/file/zone.go b/plugin/file/zone.go index 3447a942c..da294ed45 100644 --- a/plugin/file/zone.go +++ b/plugin/file/zone.go @@ -29,7 +29,7 @@ type Zone struct { NoReload bool reloadMu sync.RWMutex - ReloadShutdown chan bool + reloadShutdown chan bool Upstream upstream.Upstream // Upstream for looking up names during the resolution process } @@ -49,7 +49,7 @@ func NewZone(name, file string) *Zone { file: path.Clean(file), Tree: &tree.Tree{}, Expired: new(bool), - ReloadShutdown: make(chan bool), + reloadShutdown: make(chan bool), } *z.Expired = false |