aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2018-11-03 20:00:07 +0000
committerGravatar Yong Tang <yong.tang.github@outlook.com> 2018-11-03 13:00:07 -0700
commitc2331d7dda8280053f96ce6ff1b50aace306992a (patch)
tree5c6ae500f561583c174d21b00a53ea56434271a1
parent921b02e2d5af6535cab4d2c2113c92770e4d1f59 (diff)
downloadcoredns-c2331d7dda8280053f96ce6ff1b50aace306992a.tar.gz
coredns-c2331d7dda8280053f96ce6ff1b50aace306992a.tar.zst
coredns-c2331d7dda8280053f96ce6ff1b50aace306992a.zip
plugin/host: parse file without holding lock (#2270)
* plugin/host: parse file without holding lock Parse first and then swap the maps *while* holding the lock. Signed-off-by: Miek Gieben <miek@miek.nl> * add back in the parse function, but now purely for testing Signed-off-by: Miek Gieben <miek@miek.nl>
-rw-r--r--plugin/hosts/hosts_test.go3
-rw-r--r--plugin/hosts/hostsfile.go14
2 files changed, 9 insertions, 8 deletions
diff --git a/plugin/hosts/hosts_test.go b/plugin/hosts/hosts_test.go
index db3876132..1b74ef9ee 100644
--- a/plugin/hosts/hosts_test.go
+++ b/plugin/hosts/hosts_test.go
@@ -2,6 +2,7 @@ package hosts
import (
"context"
+ "io"
"strings"
"testing"
@@ -11,6 +12,8 @@ import (
"github.com/miekg/dns"
)
+func (h *Hostsfile) parseReader(r io.Reader) { h.hmap = h.parse(r, h.inline) }
+
func TestLookupA(t *testing.T) {
h := Hosts{Next: test.ErrorHandler(), Hostsfile: &Hostsfile{Origins: []string{"."}}}
h.parseReader(strings.NewReader(hostsExample))
diff --git a/plugin/hosts/hostsfile.go b/plugin/hosts/hostsfile.go
index af5e054fd..8b2ffa0a6 100644
--- a/plugin/hosts/hostsfile.go
+++ b/plugin/hosts/hostsfile.go
@@ -106,13 +106,17 @@ func (h *Hostsfile) readHosts() {
return
}
+ newMap := h.parse(file, h.inline)
+ log.Debugf("Parsed hosts file into %d entries", newMap.Len())
+
h.Lock()
- defer h.Unlock()
- h.parseReader(file)
+ h.hmap = newMap
// Update the data cache.
h.mtime = stat.ModTime()
h.size = stat.Size()
+
+ h.Unlock()
}
func (h *Hostsfile) initInline(inline []string) {
@@ -125,12 +129,6 @@ func (h *Hostsfile) initInline(inline []string) {
*h.hmap = *h.inline
}
-func (h *Hostsfile) parseReader(r io.Reader) {
- h.hmap = h.parse(r, h.inline)
-
- log.Debugf("Parsed hosts file into %d entries", h.hmap.Len())
-}
-
// Parse reads the hostsfile and populates the byName and byAddr maps.
func (h *Hostsfile) parse(r io.Reader, override *hostsMap) *hostsMap {
hmap := newHostsMap()