mirror of
https://github.com/coredns/coredns.git
synced 2026-07-10 17:50:12 -04:00
plugin/secondary: parse catalog zones after transfer (#8209)
This commit is contained in:
@@ -24,6 +24,7 @@ type (
|
||||
Next plugin.Handler
|
||||
Zones
|
||||
Xfer *transfer.Transfer
|
||||
TransferInFunc
|
||||
|
||||
Fall fall.F
|
||||
}
|
||||
@@ -71,7 +72,9 @@ func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
|
||||
log.Infof("Notify from %s for %s: checking transfer", state.IP(), zone)
|
||||
ok, err := z.shouldTransfer()
|
||||
if ok {
|
||||
z.TransferIn(f.Xfer)
|
||||
if err := f.transferIn(z, f.Xfer); err != nil {
|
||||
log.Warningf("Notify from %s for %s: transfer failed: %s", state.IP(), zone, err)
|
||||
}
|
||||
} else {
|
||||
log.Infof("Notify from %s for %s: no SOA serial increase seen", state.IP(), zone)
|
||||
}
|
||||
@@ -131,6 +134,13 @@ func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
|
||||
// Name implements the Handler interface.
|
||||
func (f File) Name() string { return "file" }
|
||||
|
||||
func (f File) transferIn(z *Zone, t *transfer.Transfer) error {
|
||||
if f.TransferInFunc != nil {
|
||||
return f.TransferInFunc(z, t)
|
||||
}
|
||||
return z.TransferIn(t)
|
||||
}
|
||||
|
||||
type serialErr struct {
|
||||
err string
|
||||
zone string
|
||||
|
||||
@@ -9,8 +9,17 @@ import (
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
// TransferInFunc transfers zone data into z.
|
||||
type TransferInFunc func(z *Zone, t *transfer.Transfer) error
|
||||
|
||||
// TransferIn retrieves the zone from the masters, parses it and sets it live.
|
||||
func (z *Zone) TransferIn(t *transfer.Transfer) error {
|
||||
return z.TransferInWithRecords(t, nil)
|
||||
}
|
||||
|
||||
// TransferInWithRecords retrieves the zone from the masters, calls validate
|
||||
// with the transferred records, and sets the zone live if validation succeeds.
|
||||
func (z *Zone) TransferInWithRecords(t *transfer.Transfer, validate func([]dns.RR) error) error {
|
||||
if len(z.TransferFrom) == 0 {
|
||||
return nil
|
||||
}
|
||||
@@ -22,6 +31,7 @@ func (z *Zone) TransferIn(t *transfer.Transfer) error {
|
||||
Err error
|
||||
tr string
|
||||
)
|
||||
var transferred []dns.RR
|
||||
|
||||
Transfer:
|
||||
for _, tr = range z.TransferFrom {
|
||||
@@ -32,6 +42,7 @@ Transfer:
|
||||
Err = err
|
||||
continue Transfer
|
||||
}
|
||||
var records []dns.RR
|
||||
for env := range c {
|
||||
if env.Error != nil {
|
||||
log.Errorf("Failed to transfer `%s' from %q: %v", z.origin, tr, env.Error)
|
||||
@@ -44,14 +55,23 @@ Transfer:
|
||||
Err = err
|
||||
continue Transfer
|
||||
}
|
||||
if validate != nil {
|
||||
records = append(records, rr)
|
||||
}
|
||||
}
|
||||
}
|
||||
transferred = records
|
||||
Err = nil
|
||||
break
|
||||
}
|
||||
if Err != nil {
|
||||
return Err
|
||||
}
|
||||
if validate != nil {
|
||||
if err := validate(transferred); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
z.setData(z1.Apex, z1.Tree)
|
||||
log.Infof("Transferred: %s from %s", z.origin, tr)
|
||||
@@ -114,6 +134,11 @@ func less(a, b uint32) bool {
|
||||
// server) it will retry every retry interval. If the zone failed to transfer before the expire, the zone
|
||||
// will be marked expired.
|
||||
func (z *Zone) Update(updateShutdown chan bool, t *transfer.Transfer) error {
|
||||
return z.UpdateWithTransfer(updateShutdown, t, (*Zone).TransferIn)
|
||||
}
|
||||
|
||||
// UpdateWithTransfer updates the secondary zone using transferIn for zone transfers.
|
||||
func (z *Zone) UpdateWithTransfer(updateShutdown chan bool, t *transfer.Transfer, transferIn TransferInFunc) error {
|
||||
// If we don't have a SOA, we don't have a zone, wait for it to appear.
|
||||
for z.getSOA() == nil {
|
||||
if waitOrShutdown(updateShutdown, time.Second) {
|
||||
@@ -162,7 +187,7 @@ Restart:
|
||||
}
|
||||
|
||||
if ok {
|
||||
if err := z.TransferIn(t); err != nil {
|
||||
if err := transferIn(z, t); err != nil {
|
||||
// transfer failed, leave retryActive true
|
||||
break
|
||||
}
|
||||
@@ -188,7 +213,7 @@ Restart:
|
||||
}
|
||||
|
||||
if ok {
|
||||
if err := z.TransferIn(t); err != nil {
|
||||
if err := transferIn(z, t); err != nil {
|
||||
// transfer failed
|
||||
retryActive = true
|
||||
break
|
||||
|
||||
Reference in New Issue
Block a user