diff options
Diffstat (limited to 'submitqueue/runner.go')
-rw-r--r-- | submitqueue/runner.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/submitqueue/runner.go b/submitqueue/runner.go new file mode 100644 index 000000000000..2c84a7d69b7f --- /dev/null +++ b/submitqueue/runner.go @@ -0,0 +1,60 @@ +package submitqueue + +import ( + "sync" + "time" +) + +// Runner supervises the submit queue and records historical data about it +type Runner struct { + mut sync.Mutex + submitQueue *SubmitQueue + currentlyRunning *time.Time + results []*Result +} + +func NewRunner(sq *SubmitQueue) *Runner { + return &Runner{ + submitQueue: sq, + results: []*Result{}, + } +} + +// For the frontend to consume the data +// TODO: extend to return all the submitQueue results +func (r *Runner) GetResults() (*time.Time, []*Result) { + r.mut.Lock() + defer r.mut.Unlock() + return r.currentlyRunning, r.results +} + +// Trigger starts a new batch job +// TODO: make sure only one batch job is started at the same time +// if a batch job is already started, ignore the newest request +// TODO: be more granular in dry-run mode +func (r *Runner) Trigger(fetchOnly bool) { + r.mut.Lock() + if r.currentlyRunning != nil { + return + } + now := time.Now() + r.currentlyRunning = &now + r.mut.Unlock() + + defer func() { + r.mut.Lock() + r.currentlyRunning = nil + r.mut.Unlock() + }() + + result := r.submitQueue.Run(fetchOnly) + + r.mut.Lock() + // drop tail if size > 10 + if len(r.results) > 10 { + r.results = append([]*Result{result}, r.results[:9]...) + } else { + r.results = append([]*Result{result}, r.results...) + } + r.mut.Unlock() +} |