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()
 | |
| }
 |