From dcd05032a4624dd03000f51573e3c8626a2fa76d Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Fri, 15 Apr 2016 20:00:17 +0100 Subject: [PATCH] Watch the entire directory Instead of watching a single file watch the entire directory and catch the .Name from the event. On any event, just reload the damn thing. This also fixes the problem of loosing events when the inode changes. --- middleware/file/zone.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/middleware/file/zone.go b/middleware/file/zone.go index 41be5267c..25d131251 100644 --- a/middleware/file/zone.go +++ b/middleware/file/zone.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "path" "sync" "github.com/miekg/coredns/middleware" @@ -107,7 +108,7 @@ func (z *Zone) Reload(shutdown chan bool) error { if err != nil { return err } - err = watcher.Add(z.file) + err = watcher.Add(path.Dir(z.file)) if err != nil { return err } @@ -117,11 +118,7 @@ func (z *Zone) Reload(shutdown chan bool) error { for { select { case event := <-watcher.Events: - if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Rename == fsnotify.Rename { - if err := watcher.Add(z.file); err != nil { - log.Printf("[ERROR] Failed to open `%s' for `%s': %v", z.file, z.origin, err) - } - + if event.Name == z.file { reader, err := os.Open(z.file) if err != nil { log.Printf("[ERROR] Failed to open `%s' for `%s': %v", z.file, z.origin, err) @@ -139,7 +136,7 @@ func (z *Zone) Reload(shutdown chan bool) error { z.SIG = zone.SIG z.Tree = zone.Tree z.reloadMu.Unlock() - log.Printf("[INFO] Successfully reload zone `%s'", z.origin) + log.Printf("[INFO] Successfully reloaded zone `%s'", z.origin) } case <-shutdown: watcher.Close()