From 4f3dc207a46a29edd0f36b9242ce59a6c7e104d0 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Wed, 28 Feb 2018 18:19:37 -0800 Subject: [PATCH] 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 --- plugin/auto/zone.go | 4 ++-- plugin/file/reload.go | 2 +- plugin/file/setup.go | 4 ++++ plugin/file/setup_test.go | 14 ++++++++++++++ plugin/file/shutdown.go | 9 +++++++++ plugin/file/zone.go | 4 ++-- 6 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 plugin/file/shutdown.go 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