60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
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
|
|
}
|
|
|
|
// NewRunner initializes a new runner object
|
|
func NewRunner(sq *SubmitQueue) *Runner {
|
|
return &Runner{
|
|
submitQueue: sq,
|
|
results: []*Result{},
|
|
}
|
|
}
|
|
|
|
// GetState returns a copy of all the state for the frontend
|
|
func (r *Runner) GetState() (SubmitQueue, *time.Time, []*Result) {
|
|
r.mut.Lock()
|
|
defer r.mut.Unlock()
|
|
return *r.submitQueue, 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()
|
|
}
|