mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	use tickers instead of time.After to avoid memory leak (#5220)
Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
		| @@ -84,12 +84,16 @@ func (h *Azure) Run(ctx context.Context) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	go func() { | 	go func() { | ||||||
|  | 		delay := 1 * time.Minute | ||||||
|  | 		timer := time.NewTimer(delay) | ||||||
|  | 		defer timer.Stop() | ||||||
| 		for { | 		for { | ||||||
|  | 			timer.Reset(delay) | ||||||
| 			select { | 			select { | ||||||
| 			case <-ctx.Done(): | 			case <-ctx.Done(): | ||||||
| 				log.Debugf("Breaking out of Azure update loop for %v: %v", h.zoneNames, ctx.Err()) | 				log.Debugf("Breaking out of Azure update loop for %v: %v", h.zoneNames, ctx.Err()) | ||||||
| 				return | 				return | ||||||
| 			case <-time.After(1 * time.Minute): | 			case <-timer.C: | ||||||
| 				if err := h.updateZones(ctx); err != nil && ctx.Err() == nil { | 				if err := h.updateZones(ctx); err != nil && ctx.Err() == nil { | ||||||
| 					log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) | 					log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -82,12 +82,16 @@ func (h *CloudDNS) Run(ctx context.Context) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	go func() { | 	go func() { | ||||||
|  | 		delay := 1 * time.Minute | ||||||
|  | 		timer := time.NewTimer(delay) | ||||||
|  | 		defer timer.Stop() | ||||||
| 		for { | 		for { | ||||||
|  | 			timer.Reset(delay) | ||||||
| 			select { | 			select { | ||||||
| 			case <-ctx.Done(): | 			case <-ctx.Done(): | ||||||
| 				log.Debugf("Breaking out of CloudDNS update loop for %v: %v", h.zoneNames, ctx.Err()) | 				log.Debugf("Breaking out of CloudDNS update loop for %v: %v", h.zoneNames, ctx.Err()) | ||||||
| 				return | 				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. */ { | 				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) | 					log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -92,8 +92,10 @@ func (d *dio) write(payload *tap.Dnstap) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (d *dio) serve() { | func (d *dio) serve() { | ||||||
| 	timeout := time.After(d.flushTimeout) | 	timeout := time.NewTimer(d.flushTimeout) | ||||||
|  | 	defer timeout.Stop() | ||||||
| 	for { | 	for { | ||||||
|  | 		timeout.Reset(d.flushTimeout) | ||||||
| 		select { | 		select { | ||||||
| 		case <-d.quit: | 		case <-d.quit: | ||||||
| 			if d.enc == nil { | 			if d.enc == nil { | ||||||
| @@ -106,7 +108,7 @@ func (d *dio) serve() { | |||||||
| 			if err := d.write(&payload); err != nil { | 			if err := d.write(&payload); err != nil { | ||||||
| 				d.dial() | 				d.dial() | ||||||
| 			} | 			} | ||||||
| 		case <-timeout: | 		case <-timeout.C: | ||||||
| 			if dropped := atomic.SwapUint32(&d.dropped, 0); dropped > 0 { | 			if dropped := atomic.SwapUint32(&d.dropped, 0); dropped > 0 { | ||||||
| 				log.Warningf("Dropped dnstap messages: %d", dropped) | 				log.Warningf("Dropped dnstap messages: %d", dropped) | ||||||
| 			} | 			} | ||||||
| @@ -115,7 +117,6 @@ func (d *dio) serve() { | |||||||
| 			} else { | 			} else { | ||||||
| 				d.enc.flush() | 				d.enc.flush() | ||||||
| 			} | 			} | ||||||
| 			timeout = time.After(d.flushTimeout) |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -275,19 +275,25 @@ func (k *Kubernetes) InitKubeCache(ctx context.Context) (onStart func() error, o | |||||||
| 			k.APIConn.Run() | 			k.APIConn.Run() | ||||||
| 		}() | 		}() | ||||||
|  |  | ||||||
| 		timeout := time.After(5 * time.Second) | 		timeout := 5 * time.Second | ||||||
| 		logWaiting := time.After(500 * time.Millisecond) | 		timeoutTicker := time.NewTicker(timeout) | ||||||
| 		ticker := time.NewTicker(100 * time.Millisecond) | 		defer timeoutTicker.Stop() | ||||||
| 		defer ticker.Stop() | 		logDelay := 500 * time.Millisecond | ||||||
|  | 		logTicker := time.NewTicker(logDelay) | ||||||
|  | 		defer logTicker.Stop() | ||||||
|  | 		checkSyncTicker := time.NewTicker(100 * time.Millisecond) | ||||||
|  | 		defer checkSyncTicker.Stop() | ||||||
| 		for { | 		for { | ||||||
|  | 			timeoutTicker.Reset(timeout) | ||||||
|  | 			logTicker.Reset(logDelay) | ||||||
| 			select { | 			select { | ||||||
| 			case <-ticker.C: | 			case <-checkSyncTicker.C: | ||||||
| 				if k.APIConn.HasSynced() { | 				if k.APIConn.HasSynced() { | ||||||
| 					return nil | 					return nil | ||||||
| 				} | 				} | ||||||
| 			case <-logWaiting: | 			case <-logTicker.C: | ||||||
| 				log.Info("waiting for Kubernetes API before starting server") | 				log.Info("waiting for Kubernetes API before starting server") | ||||||
| 			case <-timeout: | 			case <-timeoutTicker.C: | ||||||
| 				log.Warning("starting server with unsynced Kubernetes API") | 				log.Warning("starting server with unsynced Kubernetes API") | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -84,12 +84,15 @@ func (h *Route53) Run(ctx context.Context) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	go func() { | 	go func() { | ||||||
|  | 		timer := time.NewTimer(h.refresh) | ||||||
|  | 		defer timer.Stop() | ||||||
| 		for { | 		for { | ||||||
|  | 			timer.Reset(h.refresh) | ||||||
| 			select { | 			select { | ||||||
| 			case <-ctx.Done(): | 			case <-ctx.Done(): | ||||||
| 				log.Debugf("Breaking out of Route53 update loop for %v: %v", h.zoneNames, ctx.Err()) | 				log.Debugf("Breaking out of Route53 update loop for %v: %v", h.zoneNames, ctx.Err()) | ||||||
| 				return | 				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. */ { | 				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) | 					log.Errorf("Failed to update zones %v: %v", h.zoneNames, err) | ||||||
| 				} | 				} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user