diff --git a/plugin/azure/azure.go b/plugin/azure/azure.go index 6b4aba0cc..ed83a0af7 100644 --- a/plugin/azure/azure.go +++ b/plugin/azure/azure.go @@ -84,12 +84,16 @@ func (h *Azure) Run(ctx context.Context) error { return err } go func() { + delay := 1 * time.Minute + timer := time.NewTimer(delay) + defer timer.Stop() for { + timer.Reset(delay) select { case <-ctx.Done(): log.Debugf("Breaking out of Azure update loop for %v: %v", h.zoneNames, ctx.Err()) return - case <-time.After(1 * time.Minute): + case <-timer.C: if err := h.updateZones(ctx); err != nil && ctx.Err() == nil { log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) } diff --git a/plugin/clouddns/clouddns.go b/plugin/clouddns/clouddns.go index 371832440..4556ecac6 100644 --- a/plugin/clouddns/clouddns.go +++ b/plugin/clouddns/clouddns.go @@ -82,12 +82,16 @@ func (h *CloudDNS) Run(ctx context.Context) error { return err } go func() { + delay := 1 * time.Minute + timer := time.NewTimer(delay) + defer timer.Stop() for { + timer.Reset(delay) select { case <-ctx.Done(): log.Debugf("Breaking out of CloudDNS update loop for %v: %v", h.zoneNames, ctx.Err()) return - case <-time.After(1 * time.Minute): + case <-timer.C: if err := h.updateZones(ctx); err != nil && ctx.Err() == nil /* Don't log error if ctx expired. */ { log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) } diff --git a/plugin/dnstap/io.go b/plugin/dnstap/io.go index 6823fa8a6..6b8c9bebe 100644 --- a/plugin/dnstap/io.go +++ b/plugin/dnstap/io.go @@ -92,8 +92,10 @@ func (d *dio) write(payload *tap.Dnstap) error { } func (d *dio) serve() { - timeout := time.After(d.flushTimeout) + timeout := time.NewTimer(d.flushTimeout) + defer timeout.Stop() for { + timeout.Reset(d.flushTimeout) select { case <-d.quit: if d.enc == nil { @@ -106,7 +108,7 @@ func (d *dio) serve() { if err := d.write(&payload); err != nil { d.dial() } - case <-timeout: + case <-timeout.C: if dropped := atomic.SwapUint32(&d.dropped, 0); dropped > 0 { log.Warningf("Dropped dnstap messages: %d", dropped) } @@ -115,7 +117,6 @@ func (d *dio) serve() { } else { d.enc.flush() } - timeout = time.After(d.flushTimeout) } } } diff --git a/plugin/kubernetes/kubernetes.go b/plugin/kubernetes/kubernetes.go index cf52ae41b..10bf29938 100644 --- a/plugin/kubernetes/kubernetes.go +++ b/plugin/kubernetes/kubernetes.go @@ -275,19 +275,25 @@ func (k *Kubernetes) InitKubeCache(ctx context.Context) (onStart func() error, o k.APIConn.Run() }() - timeout := time.After(5 * time.Second) - logWaiting := time.After(500 * time.Millisecond) - ticker := time.NewTicker(100 * time.Millisecond) - defer ticker.Stop() + timeout := 5 * time.Second + timeoutTicker := time.NewTicker(timeout) + defer timeoutTicker.Stop() + logDelay := 500 * time.Millisecond + logTicker := time.NewTicker(logDelay) + defer logTicker.Stop() + checkSyncTicker := time.NewTicker(100 * time.Millisecond) + defer checkSyncTicker.Stop() for { + timeoutTicker.Reset(timeout) + logTicker.Reset(logDelay) select { - case <-ticker.C: + case <-checkSyncTicker.C: if k.APIConn.HasSynced() { return nil } - case <-logWaiting: + case <-logTicker.C: log.Info("waiting for Kubernetes API before starting server") - case <-timeout: + case <-timeoutTicker.C: log.Warning("starting server with unsynced Kubernetes API") return nil } diff --git a/plugin/route53/route53.go b/plugin/route53/route53.go index 930acc6d3..72cb74e8f 100644 --- a/plugin/route53/route53.go +++ b/plugin/route53/route53.go @@ -84,12 +84,15 @@ func (h *Route53) Run(ctx context.Context) error { return err } go func() { + timer := time.NewTimer(h.refresh) + defer timer.Stop() for { + timer.Reset(h.refresh) select { case <-ctx.Done(): log.Debugf("Breaking out of Route53 update loop for %v: %v", h.zoneNames, ctx.Err()) return - case <-time.After(h.refresh): + case <-timer.C: if err := h.updateZones(ctx); err != nil && ctx.Err() == nil /* Don't log error if ctx expired. */ { log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) }