]> Cypherpunks repositories - gostls13.git/commitdiff
net: ensure identical queries are not sent multiple times in builtin stub resolver
authorAlex A Skinner <alex@lx.lc>
Fri, 29 Aug 2014 22:50:50 +0000 (07:50 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Fri, 29 Aug 2014 22:50:50 +0000 (07:50 +0900)
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

src/pkg/net/dnsclient_unix.go
src/pkg/net/dnsclient_unix_test.go

index eb4b5900de8fe336af3c92f46680af8e26940039..dc5eed96cc605952ba7272883431f2f840f68ead 100644 (file)
@@ -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
index 39d82d9961d34c748a5c77fa1a655be924a4bf92..204c8b7ef7eaf73aec33f17cb7fc1c7c90467821 100644 (file)
@@ -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")
+       }
+}