From: Alex A Skinner Date: Fri, 29 Aug 2014 22:50:50 +0000 (+0900) Subject: net: ensure identical queries are not sent multiple times in builtin stub resolver X-Git-Tag: go1.4beta1~620 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=854dbb7fdcc85ca187e4d91a5a85d392242bb1cb;p=gostls13.git net: ensure identical queries are not sent multiple times in builtin stub resolver Prevents non-rooted queries with > ndots dots from being tried twice on error. Fixes #8616. Benchmark results on linux/amd64 benchmark old ns/op new ns/op delta BenchmarkGoLookupIPNoSuchHost 8212394 4413293 -46.26% benchmark old allocs new allocs delta BenchmarkGoLookupIPNoSuchHost 216 108 -50.00% benchmark old bytes new bytes delta BenchmarkGoLookupIPNoSuchHost 17460 8726 -50.02% LGTM=iant, mikioh.mikioh R=golang-codereviews, iant, mikioh.mikioh CC=golang-codereviews https://golang.org/cl/137870043 --- diff --git a/src/pkg/net/dnsclient_unix.go b/src/pkg/net/dnsclient_unix.go index eb4b5900de..dc5eed96cc 100644 --- a/src/pkg/net/dnsclient_unix.go +++ b/src/pkg/net/dnsclient_unix.go @@ -310,13 +310,10 @@ func lookup(name string, qtype uint16) (cname string, addrs []dnsRR, err error) } // Can try as ordinary name. cname, addrs, err = tryOneName(cfg.dnsConfig, rname, qtype) - if err == nil { + if rooted || err == nil { return } } - if rooted { - return - } // Otherwise, try suffixes. for i := 0; i < len(cfg.dnsConfig.search); i++ { @@ -330,15 +327,15 @@ func lookup(name string, qtype uint16) (cname string, addrs []dnsRR, err error) } } - // Last ditch effort: try unsuffixed. - rname := name - if !rooted { - rname += "." - } - cname, addrs, err = tryOneName(cfg.dnsConfig, rname, qtype) - if err == nil { - return + // Last ditch effort: try unsuffixed only if we haven't already, + // that is, name is not rooted and has less than ndots dots. + if count(name, '.') < cfg.dnsConfig.ndots { + cname, addrs, err = tryOneName(cfg.dnsConfig, name+".", qtype) + if err == nil { + return + } } + if e, ok := err.(*DNSError); ok { // Show original name passed to lookup, not suffixed one. // In general we might have tried many suffixes; showing diff --git a/src/pkg/net/dnsclient_unix_test.go b/src/pkg/net/dnsclient_unix_test.go index 39d82d9961..204c8b7ef7 100644 --- a/src/pkg/net/dnsclient_unix_test.go +++ b/src/pkg/net/dnsclient_unix_test.go @@ -217,3 +217,9 @@ func TestReloadResolvConfChange(t *testing.T) { r.SetConf("nameserver 8.8.4.4") r.WantServers([]string{"[8.8.4.4]"}) } + +func BenchmarkGoLookupIPNoSuchHost(b *testing.B) { + for i := 0; i < b.N; i++ { + goLookupIP("some.nonexistent") + } +}