diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2026-01-27 09:05:48 -0800 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2026-02-02 10:15:12 -0800 |
| commit | 6de7a19fea07bf8a9a54b7d9d3dc839fe2ea9d33 (patch) | |
| tree | 6f0726cffb6ddff44b770e7e5fc08e4185af8707 /src/net/dnsclient_unix.go | |
| parent | 11d5284363ed88b8cc8ec6e68db80a16b2f9e708 (diff) | |
| download | go-6de7a19fea07bf8a9a54b7d9d3dc839fe2ea9d33.tar.xz | |
net: don't wait 5 seconds to re-read /etc/resolv.conf
If a Go process starts up, finds /etc/resolv.conf empty, then the DHCP
client writes /etc/resolv.conf, the Go program would find itself
broken for up to 5 seconds.
We noticed this during integration tests in ephemeral VMs using
gokrazy that boot into our application.
Change-Id: Ia64c2b5c698a4ee3efc15d8a8f1850c47e531b84
Reviewed-on: https://go-review.googlesource.com/c/go/+/739620
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/net/dnsclient_unix.go')
| -rw-r--r-- | src/net/dnsclient_unix.go | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index bf0456ba26..4d7b2fb5ea 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -382,13 +382,18 @@ func (conf *resolverConfig) init() { conf.ch = make(chan struct{}, 1) } +// distantFuture is a sentinel time used for tests to signal that +// resolv.conf should not be rechecked. +var distantFuture = time.Date(3000, 1, 2, 3, 4, 5, 6, time.UTC) + // tryUpdate tries to update conf with the named resolv.conf file. // The name variable only exists for testing. It is otherwise always // "/etc/resolv.conf". func (conf *resolverConfig) tryUpdate(name string) { conf.initOnce.Do(conf.init) - if conf.dnsConfig.Load().noReload { + dc := conf.dnsConfig.Load() + if dc.noReload { return } @@ -399,7 +404,8 @@ func (conf *resolverConfig) tryUpdate(name string) { defer conf.releaseSema() now := time.Now() - if conf.lastChecked.After(now.Add(-5 * time.Second)) { + if (len(dc.servers) > 0 && conf.lastChecked.After(now.Add(-5*time.Second))) || + conf.lastChecked == distantFuture { return } conf.lastChecked = now |
