plugin/file: load secondary zones lazily on startup (#2944)

This fixes a long standing bug:
fixes: #1609

Load secondary zones in a go-routine; this required another mutex to
protect some fields; I think those were needded anyway because a
transfer can also happen when we're running; we just didn't have a test
for that situation.

The test had to be changed to wait for the transfer to happen at this is
async now.

Signed-off-by: Miek Gieben <miek@miek.nl>
This commit is contained in:
Miek Gieben
2019-06-29 22:22:34 +01:00
committed by Yong Tang
parent 2c1f5009be
commit 3a0c7c6153
7 changed files with 21 additions and 17 deletions

View File

@@ -21,7 +21,8 @@ type Zone struct {
origLen int
file string
*tree.Tree
Apex Apex
Apex
apexMu sync.RWMutex
TransferTo []string
StartupOnce sync.Once
@@ -32,7 +33,7 @@ type Zone struct {
LastReloaded time.Time
reloadMu sync.RWMutex
reloadShutdown chan bool
Upstream *upstream.Upstream // Upstream for looking up external names during the resolution process
Upstream *upstream.Upstream // Upstream for looking up external names during the resolution process.
}
// Apex contains the apex records of a zone: SOA, NS and their potential signatures.
@@ -55,7 +56,6 @@ func NewZone(name, file string) *Zone {
LastReloaded: time.Now(),
}
*z.Expired = false
return z
}
@@ -186,11 +186,6 @@ func (z *Zone) All() []dns.RR {
return append([]dns.RR{z.Apex.SOA}, records...)
}
// Print prints the zone's tree to stdout.
func (z *Zone) Print() {
z.Tree.Print()
}
// NameFromRight returns the labels from the right, staring with the
// origin and then i labels extra. When we are overshooting the name
// the returned boolean is set to true.