diff options
| author | zen <mobi2009ro@gmail.com> | 2023-01-16 19:52:03 -0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-02-15 22:27:16 +0000 |
| commit | 87366feb125008aadc85ace6ccbfd2213b640c9c (patch) | |
| tree | c230c45f848e7d1263c5a3a07451dafb193b1a62 | |
| parent | 2994e9aa79718fbb0658ec5f50ee4b69276401d6 (diff) | |
| download | go-87366feb125008aadc85ace6ccbfd2213b640c9c.tar.xz | |
net: retry if GetAddrInfoW returns WSTRY_AGAIN when resolving an IP
GetAddrInfoW is retried now multiple times as per the timeout and number of retries defined in func dnsReadConfig (before it was called only once)
Fixes #55050
Change-Id: If5369ebb164d98557a802de938756dbf9c125773
Reviewed-on: https://go-review.googlesource.com/c/go/+/462051
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Bryan Mills <bcmills@google.com>
Reviewed-by: Quim Muntal <quimmuntal@gmail.com>
Run-TryBot: Quim Muntal <quimmuntal@gmail.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
| -rw-r--r-- | src/net/lookup_windows.go | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/net/lookup_windows.go b/src/net/lookup_windows.go index 4ee728196b..11f43fe1c7 100644 --- a/src/net/lookup_windows.go +++ b/src/net/lookup_windows.go @@ -10,10 +10,14 @@ import ( "os" "runtime" "syscall" + "time" "unsafe" ) -const _WSAHOST_NOT_FOUND = syscall.Errno(11001) +const ( + _WSAHOST_NOT_FOUND = syscall.Errno(11001) + _WSATRY_AGAIN = syscall.Errno(11002) +) func winError(call string, err error) error { switch err { @@ -118,7 +122,17 @@ func (r *Resolver) lookupIP(ctx context.Context, network, name string) ([]IPAddr if err != nil { return nil, &DNSError{Name: name, Err: err.Error()} } - e := syscall.GetAddrInfoW(name16p, nil, &hints, &result) + + dnsConf := getSystemDNSConfig() + start := time.Now() + + var e error + for i := 0; i < dnsConf.attempts; i++ { + e = syscall.GetAddrInfoW(name16p, nil, &hints, &result) + if e == nil || e != _WSATRY_AGAIN || time.Since(start) > dnsConf.timeout { + break + } + } if e != nil { err := winError("getaddrinfow", e) dnsError := &DNSError{Err: err.Error(), Name: name} |
