mirror of
https://github.com/golang/go
synced 2024-11-26 11:38:01 -07:00
net: make go resolver aware of network parameter
Currently, the go resolver always send two DNS queries (A and AAAA) even
if tcp4/udp4/ip4 or tcp6/udp6/ip6 is used. This can cause unwanted
latencies when making IPv4-only or IPv6-only connections.
This change make go resolver aware of network parameter. Now, only one A
query is sent when tcp4/udp4/ip4 is used, and vice versa for
tcp6/udp6/ip6.
Fixes #45024
Change-Id: I815f909e6df5f7242cfc900f7dfecca628c3a2c8
GitHub-Last-Rev: 3d30c486de
GitHub-Pull-Request: golang/go#45016
Reviewed-on: https://go-review.googlesource.com/c/go/+/301709
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Emmanuel Odeke <emmanuel@orijtech.com>
This commit is contained in:
parent
f4b918384d
commit
53dd0d7809
@ -532,7 +532,7 @@ func (r *Resolver) goLookupHostOrder(ctx context.Context, name string, order hos
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ips, _, err := r.goLookupIPCNAMEOrder(ctx, name, order)
|
ips, _, err := r.goLookupIPCNAMEOrder(ctx, "ip", name, order)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -558,13 +558,13 @@ func goLookupIPFiles(name string) (addrs []IPAddr) {
|
|||||||
|
|
||||||
// goLookupIP is the native Go implementation of LookupIP.
|
// goLookupIP is the native Go implementation of LookupIP.
|
||||||
// The libc versions are in cgo_*.go.
|
// The libc versions are in cgo_*.go.
|
||||||
func (r *Resolver) goLookupIP(ctx context.Context, host string) (addrs []IPAddr, err error) {
|
func (r *Resolver) goLookupIP(ctx context.Context, network, host string) (addrs []IPAddr, err error) {
|
||||||
order := systemConf().hostLookupOrder(r, host)
|
order := systemConf().hostLookupOrder(r, host)
|
||||||
addrs, _, err = r.goLookupIPCNAMEOrder(ctx, host, order)
|
addrs, _, err = r.goLookupIPCNAMEOrder(ctx, network, host, order)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order hostLookupOrder) (addrs []IPAddr, cname dnsmessage.Name, err error) {
|
func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, network, name string, order hostLookupOrder) (addrs []IPAddr, cname dnsmessage.Name, err error) {
|
||||||
if order == hostLookupFilesDNS || order == hostLookupFiles {
|
if order == hostLookupFilesDNS || order == hostLookupFiles {
|
||||||
addrs = goLookupIPFiles(name)
|
addrs = goLookupIPFiles(name)
|
||||||
if len(addrs) > 0 || order == hostLookupFiles {
|
if len(addrs) > 0 || order == hostLookupFiles {
|
||||||
@ -585,7 +585,13 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order
|
|||||||
error
|
error
|
||||||
}
|
}
|
||||||
lane := make(chan result, 1)
|
lane := make(chan result, 1)
|
||||||
qtypes := [...]dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA}
|
qtypes := []dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA}
|
||||||
|
switch ipVersion(network) {
|
||||||
|
case '4':
|
||||||
|
qtypes = []dnsmessage.Type{dnsmessage.TypeA}
|
||||||
|
case '6':
|
||||||
|
qtypes = []dnsmessage.Type{dnsmessage.TypeAAAA}
|
||||||
|
}
|
||||||
var queryFn func(fqdn string, qtype dnsmessage.Type)
|
var queryFn func(fqdn string, qtype dnsmessage.Type)
|
||||||
var responseFn func(fqdn string, qtype dnsmessage.Type) result
|
var responseFn func(fqdn string, qtype dnsmessage.Type) result
|
||||||
if conf.singleRequest {
|
if conf.singleRequest {
|
||||||
@ -730,7 +736,7 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order
|
|||||||
// goLookupCNAME is the native Go (non-cgo) implementation of LookupCNAME.
|
// goLookupCNAME is the native Go (non-cgo) implementation of LookupCNAME.
|
||||||
func (r *Resolver) goLookupCNAME(ctx context.Context, host string) (string, error) {
|
func (r *Resolver) goLookupCNAME(ctx context.Context, host string) (string, error) {
|
||||||
order := systemConf().hostLookupOrder(r, host)
|
order := systemConf().hostLookupOrder(r, host)
|
||||||
_, cname, err := r.goLookupIPCNAMEOrder(ctx, host, order)
|
_, cname, err := r.goLookupIPCNAMEOrder(ctx, "ip", host, order)
|
||||||
return cname.String(), err
|
return cname.String(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -601,14 +601,14 @@ func TestGoLookupIPOrderFallbackToFile(t *testing.T) {
|
|||||||
name := fmt.Sprintf("order %v", order)
|
name := fmt.Sprintf("order %v", order)
|
||||||
|
|
||||||
// First ensure that we get an error when contacting a non-existent host.
|
// First ensure that we get an error when contacting a non-existent host.
|
||||||
_, _, err := r.goLookupIPCNAMEOrder(context.Background(), "notarealhost", order)
|
_, _, err := r.goLookupIPCNAMEOrder(context.Background(), "ip", "notarealhost", order)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("%s: expected error while looking up name not in hosts file", name)
|
t.Errorf("%s: expected error while looking up name not in hosts file", name)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now check that we get an address when the name appears in the hosts file.
|
// Now check that we get an address when the name appears in the hosts file.
|
||||||
addrs, _, err := r.goLookupIPCNAMEOrder(context.Background(), "thor", order) // entry is in "testdata/hosts"
|
addrs, _, err := r.goLookupIPCNAMEOrder(context.Background(), "ip", "thor", order) // entry is in "testdata/hosts"
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("%s: expected to successfully lookup host entry", name)
|
t.Errorf("%s: expected to successfully lookup host entry", name)
|
||||||
continue
|
continue
|
||||||
|
@ -90,7 +90,7 @@ func (r *Resolver) lookupHost(ctx context.Context, host string) (addrs []string,
|
|||||||
|
|
||||||
func (r *Resolver) lookupIP(ctx context.Context, network, host string) (addrs []IPAddr, err error) {
|
func (r *Resolver) lookupIP(ctx context.Context, network, host string) (addrs []IPAddr, err error) {
|
||||||
if r.preferGo() {
|
if r.preferGo() {
|
||||||
return r.goLookupIP(ctx, host)
|
return r.goLookupIP(ctx, network, host)
|
||||||
}
|
}
|
||||||
order := systemConf().hostLookupOrder(r, host)
|
order := systemConf().hostLookupOrder(r, host)
|
||||||
if order == hostLookupCgo {
|
if order == hostLookupCgo {
|
||||||
@ -100,7 +100,7 @@ func (r *Resolver) lookupIP(ctx context.Context, network, host string) (addrs []
|
|||||||
// cgo not available (or netgo); fall back to Go's DNS resolver
|
// cgo not available (or netgo); fall back to Go's DNS resolver
|
||||||
order = hostLookupFilesDNS
|
order = hostLookupFilesDNS
|
||||||
}
|
}
|
||||||
ips, _, err := r.goLookupIPCNAMEOrder(ctx, host, order)
|
ips, _, err := r.goLookupIPCNAMEOrder(ctx, network, host, order)
|
||||||
return ips, err
|
return ips, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ func TestGoLookupIP(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
if _, err := DefaultResolver.goLookupIP(ctx, host); err != nil {
|
if _, err := DefaultResolver.goLookupIP(ctx, "ip", host); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user