aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2018-02-28 18:19:37 -0800
committerGravatar GitHub <noreply@github.com> 2018-02-28 18:19:37 -0800
commit4f3dc207a46a29edd0f36b9242ce59a6c7e104d0 (patch)
tree698274f29cd2a7f911d9bd363d5e92ee01c0c5db
parent6bb08ffee446573c8f401160fa7830ffacca8530 (diff)
downloadcoredns-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.go4
-rw-r--r--plugin/file/reload.go2
-rw-r--r--plugin/file/setup.go4
-rw-r--r--plugin/file/setup_test.go14
-rw-r--r--plugin/file/shutdown.go9
-rw-r--r--plugin/file/zone.go4
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