diff --git a/core/setup/secondary.go b/core/setup/secondary.go index 2f620c43e..e8326fa25 100644 --- a/core/setup/secondary.go +++ b/core/setup/secondary.go @@ -17,13 +17,12 @@ func Secondary(c *Controller) (middleware.Middleware, error) { for _, n := range zones.Names { if len(zones.Z[n].TransferFrom) > 0 { c.Startup = append(c.Startup, func() error { - err := zones.Z[n].TransferIn() - return err - }) - c.Startup = append(c.Startup, func() error { - go func() { - zones.Z[n].Update() - }() + zones.Z[n].StartupOnce.Do(func() { + zones.Z[n].TransferIn() + go func() { + zones.Z[n].Update() + }() + }) return nil }) } diff --git a/middleware/file/secondary.go b/middleware/file/secondary.go index 057d6a4f3..66b1daa98 100644 --- a/middleware/file/secondary.go +++ b/middleware/file/secondary.go @@ -18,10 +18,13 @@ func (z *Zone) TransferIn() error { m.SetAxfr(z.name) z1 := z.Copy() - var Err error + var ( + Err error + tr string + ) Transfer: - for _, tr := range z.TransferFrom { + for _, tr = range z.TransferFrom { t := new(dns.Transfer) c, err := t.In(m, tr) if err != nil { @@ -52,15 +55,15 @@ Transfer: break } if Err != nil { - log.Printf("[ERROR] Failed to transfer %s", z.name) - return nil + log.Printf("[ERROR] Failed to transfer %s: %s", z.name, Err) + return Err } z.Tree = z1.Tree z.SOA = z1.SOA z.SIG = z1.SIG *z.Expired = false - log.Printf("[INFO] Transferred: %s", z.name) + log.Printf("[INFO] Transferred: %s from %s", z.name, tr) return nil } diff --git a/middleware/file/zone.go b/middleware/file/zone.go index c0bd2ffa6..f9bb8efe2 100644 --- a/middleware/file/zone.go +++ b/middleware/file/zone.go @@ -1,6 +1,8 @@ package file import ( + "sync" + "github.com/miekg/coredns/middleware" "github.com/miekg/coredns/middleware/file/tree" @@ -14,6 +16,7 @@ type Zone struct { *tree.Tree TransferTo []string + StartupOnce sync.Once TransferFrom []string Expired *bool }