plugin/file: Fix memory leak in Parse (#2194)

For zone files with more than 10,000 records, the goroutines and memory
pinned by dns.ParseZone won't be released unless the tokens chan is
drained. As Parse is called by (*Zone).Reload very frequently, this
causes memory leaks and OOM conditions.

Updates miekg/dns#786
This commit is contained in:
Tom Thorogood 2018-10-14 04:26:42 +10:30 committed by Miek Gieben
parent 3cef6674e9
commit 1847ef6bd3

View file

@ -121,6 +121,12 @@ func (s *serialErr) Error() string {
// it returns an error indicating nothing was read.
func Parse(f io.Reader, origin, fileName string, serial int64) (*Zone, error) {
tokens := dns.ParseZone(f, dns.Fqdn(origin), fileName)
defer func() {
// Drain the tokens chan so that large zone files won't
// leak goroutines and memory.
for range tokens {
}
}()
z := NewZone(origin, fileName)
seenSOA := false
for x := range tokens {