mirror of
https://github.com/golang/go.git
synced 2026-02-06 18:00:01 +00:00
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>
This commit is contained in:
parent
11d5284363
commit
6de7a19fea
2 changed files with 9 additions and 3 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue