From 8a5b9aa170deadf0620b192d58647d5347ca0ddb Mon Sep 17 00:00:00 2001 From: losyme Date: Sun, 7 Nov 2021 17:13:40 +0100 Subject: [PATCH] =?UTF-8?q?En=20cours=20de=20d=C3=A9veloppement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/storage/memory/next.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/internal/storage/memory/next.go b/internal/storage/memory/next.go index 9a90c57..b46a076 100644 --- a/internal/storage/memory/next.go +++ b/internal/storage/memory/next.go @@ -6,15 +6,22 @@ package memory -import "forge.chapril.org/dune/jw" +import ( + "sort" + "time" + + "forge.chapril.org/dune/jw" +) type jobsToRun struct { // AFINIR: sync.Pool ? jobs []*jw.Job } func (jtr *jobsToRun) Next() (*jw.Job, error) { + now := time.Now() + for i, job := range jtr.jobs { - if job.Status == jw.StatusTodo { + if (job.Status == jw.StatusTodo || job.Status == jw.StatusPending) && job.RunAfter.Before(now) { jtr.jobs = jtr.jobs[i+1:] return job, nil } @@ -41,7 +48,20 @@ func (m *memory) NextJob(fn jw.SelectNextJob) (*jw.Job, error) { m.sm.Lock() defer m.sm.Unlock() - job, err := fn(m.jobsRunning(), &jobsToRun{jobs: m.jobs}) + jobs := make([]*jw.Job, len(m.jobs)) + copy(jobs, m.jobs) + + sort.Slice( + jobs, + func(i, j int) bool { + ji := jobs[i] + jj := jobs[j] + + return ji.Priority > jj.Priority || ji.Weight < jj.Weight || ji.TimeReference.Before(jj.TimeReference) + }, + ) + + job, err := fn(m.jobsRunning(), &jobsToRun{jobs}) if job == nil || err != nil { return nil, err }