package configsource import ( "context" "time" ) func (c *Controller) Run(ctx context.Context, hup <-chan struct{}) { var tick <-chan time.Time if c.git { ch, stop := c.tick(pollInterval) defer stop() tick = ch } done := make(chan struct{}, 1) inflight, queued := false, false start := func() { inflight = true go func() { if err := c.Step(ctx); err != nil && ctx.Err() == nil { c.logger.Warn("config step failed", "err", err) } done <- struct{}{} }() } trigger := func() { if inflight { queued = true return } start() } for { select { case <-ctx.Done(): if inflight { <-done } return case <-tick: trigger() case _, ok := <-hup: if !ok { hup = nil continue } trigger() case <-done: inflight = false if queued { queued = false start() } } } }