59 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 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
 | 
						|
}
 | 
						|
 | 
						|
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()
 | 
						|
}
 |