gosuki/pkg/watch/reducer.go

43 lines
1010 B
Go
Raw Normal View History

package watch
2018-11-09 17:25:50 +00:00
import "time"
2018-11-09 17:25:50 +00:00
2018-11-13 18:57:07 +00:00
// Run reducer in its own thread when the watcher is started
2018-11-09 17:25:50 +00:00
// It receives a struct{event, func} and runs the func only once in the interval
func ReduceEvents(interval time.Duration,
w WatchRunner) {
watch := w.Watch()
log.Debugf("starting reducer service for %s", watch.ID)
2018-11-09 17:25:50 +00:00
eventsIn := w.Watch().eventsChan
2018-11-09 17:25:50 +00:00
timer := time.NewTimer(interval)
beat := time.NewTicker(1 * time.Second).C
2018-11-09 17:25:50 +00:00
var events []bool
for {
select {
case <-eventsIn:
2022-09-28 20:08:21 +00:00
// log.Debug("[reducuer] received event, resetting watch interval !")
2018-11-09 17:25:50 +00:00
timer.Reset(interval)
events = append(events, true)
case <-beat:
// log.Debugf("reducer beat %s", watch.ID)
2018-11-09 17:25:50 +00:00
case <-timer.C:
if len(events) > 0 {
log.Debug("<reduce>: calling Run()")
2018-11-09 17:25:50 +00:00
w.Run()
// Empty events queue
events = make([]bool, 0)
}
case _, ok := <-eventsIn:
if !ok {
log.Warningf("Events channel closed for %s", watch.ID)
return // Exit the function or handle the closed channel case
}
2018-11-09 17:25:50 +00:00
}
}
}