Use timer instead of ticker (#477)

Tickers always tick, so if we tick every 5 seconds and the work that we
perform at each tick takes 5 seconds, we end up just looping with no
sleep period.

Instead this is using a timer to ensure we actually get a full 5 second
sleep between loops.

We should consider an async API instead of polling the provider like
this.
This commit is contained in:
Brian Goff
2018-12-21 15:48:47 -08:00
committed by GitHub
parent b44072588b
commit 3ab101da00

View File

@@ -76,24 +76,25 @@ func (s *Server) Run(ctx context.Context) error {
// providerSyncLoop syncronizes pod states from the provider back to kubernetes
func (s *Server) providerSyncLoop(ctx context.Context) {
// TODO(@cpuguy83): Ticker does not seem like the right thing to use here. A
// ticker keeps ticking while we are updating state, which can be a long
// operation. This would lead to just a constant re-sync rather than sleeping
// for 5 seconds between each loop.
//
// Leaving this note here as fixing is out of scope for my current changeset.
tick := time.NewTicker(5 * time.Second)
defer tick.Stop()
const sleepTime = 5 * time.Second
t := time.NewTimer(sleepTime)
defer t.Stop()
for {
select {
case <-ctx.Done():
return
case <-tick.C:
case <-t.C:
t.Stop()
ctx, span := trace.StartSpan(ctx, "syncActualState")
s.updateNode(ctx)
s.updatePodStatuses(ctx)
span.End()
// restart the timer
t.Reset(sleepTime)
}
}
}