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
This commit is contained in:
Miek Gieben 2018-02-28 18:19:37 -08:00 committed by GitHub
parent 6bb08ffee4
commit 4f3dc207a4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 32 additions and 5 deletions

View file

@ -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)

View file

@ -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
}

View file

@ -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}

View file

@ -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 {

9
plugin/file/shutdown.go Normal file
View file

@ -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
}

View file

@ -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