aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2026-01-27 09:05:48 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2026-02-02 10:15:12 -0800
commit6de7a19fea07bf8a9a54b7d9d3dc839fe2ea9d33 (patch)
tree6f0726cffb6ddff44b770e7e5fc08e4185af8707 /src
parent11d5284363ed88b8cc8ec6e68db80a16b2f9e708 (diff)
downloadgo-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')
-rw-r--r--src/net/conf_test.go2
-rw-r--r--src/net/dnsclient_unix.go10
2 files changed, 9 insertions, 3 deletions
diff --git a/src/net/conf_test.go b/src/net/conf_test.go
index 6ebd6be635..075253cbc1 100644
--- a/src/net/conf_test.go
+++ b/src/net/conf_test.go
@@ -396,7 +396,7 @@ func TestConfHostLookupOrder(t *testing.T) {
defer conf.teardown()
for _, tt := range tests {
- if !conf.forceUpdateConf(tt.resolv, time.Now().Add(time.Hour)) {
+ if !conf.forceUpdateConf(tt.resolv, distantFuture) {
t.Errorf("%s: failed to change resolv config", tt.name)
}
for _, ht := range tt.hostTests {
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