Only transfer a zone once (#117)

Use sync.Once to only transfer a zone once.

Fixes #115
This commit is contained in:
Miek Gieben 2016-04-13 20:14:03 +01:00
parent 5a8a125399
commit 982377516b
3 changed files with 17 additions and 12 deletions

View file

@ -17,13 +17,12 @@ func Secondary(c *Controller) (middleware.Middleware, error) {
for _, n := range zones.Names { for _, n := range zones.Names {
if len(zones.Z[n].TransferFrom) > 0 { if len(zones.Z[n].TransferFrom) > 0 {
c.Startup = append(c.Startup, func() error { c.Startup = append(c.Startup, func() error {
err := zones.Z[n].TransferIn() zones.Z[n].StartupOnce.Do(func() {
return err zones.Z[n].TransferIn()
}) go func() {
c.Startup = append(c.Startup, func() error { zones.Z[n].Update()
go func() { }()
zones.Z[n].Update() })
}()
return nil return nil
}) })
} }

View file

@ -18,10 +18,13 @@ func (z *Zone) TransferIn() error {
m.SetAxfr(z.name) m.SetAxfr(z.name)
z1 := z.Copy() z1 := z.Copy()
var Err error var (
Err error
tr string
)
Transfer: Transfer:
for _, tr := range z.TransferFrom { for _, tr = range z.TransferFrom {
t := new(dns.Transfer) t := new(dns.Transfer)
c, err := t.In(m, tr) c, err := t.In(m, tr)
if err != nil { if err != nil {
@ -52,15 +55,15 @@ Transfer:
break break
} }
if Err != nil { if Err != nil {
log.Printf("[ERROR] Failed to transfer %s", z.name) log.Printf("[ERROR] Failed to transfer %s: %s", z.name, Err)
return nil return Err
} }
z.Tree = z1.Tree z.Tree = z1.Tree
z.SOA = z1.SOA z.SOA = z1.SOA
z.SIG = z1.SIG z.SIG = z1.SIG
*z.Expired = false *z.Expired = false
log.Printf("[INFO] Transferred: %s", z.name) log.Printf("[INFO] Transferred: %s from %s", z.name, tr)
return nil return nil
} }

View file

@ -1,6 +1,8 @@
package file package file
import ( import (
"sync"
"github.com/miekg/coredns/middleware" "github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/file/tree" "github.com/miekg/coredns/middleware/file/tree"
@ -14,6 +16,7 @@ type Zone struct {
*tree.Tree *tree.Tree
TransferTo []string TransferTo []string
StartupOnce sync.Once
TransferFrom []string TransferFrom []string
Expired *bool Expired *bool
} }