aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzen <mobi2009ro@gmail.com>2023-01-16 19:52:03 -0800
committerGopher Robot <gobot@golang.org>2023-02-15 22:27:16 +0000
commit87366feb125008aadc85ace6ccbfd2213b640c9c (patch)
treec230c45f848e7d1263c5a3a07451dafb193b1a62
parent2994e9aa79718fbb0658ec5f50ee4b69276401d6 (diff)
downloadgo-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.go18
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}