diff --git a/guix-data-service/jobs.scm b/guix-data-service/jobs.scm index dd680d0..25097f8 100644 --- a/guix-data-service/jobs.scm +++ b/guix-data-service/jobs.scm @@ -129,12 +129,17 @@ #f) ((jobs ...) (for-each - (lambda (job-args) - (let ((current-processes - (hash-count (const #t) processes))) - (when (< current-processes - max-processes) - (fork-and-process-job job-args)))) + (match-lambda + ((job-id priority?) + (let ((current-processes + (hash-count (const #t) processes))) + (when (< current-processes + (if priority? + ;; For priority jobs, burst up to twice the number + ;; of max processes + (* 2 max-processes) + max-processes)) + (fork-and-process-job (list job-id)))))) jobs))) (unless (eq? 0 (sleep 15)) (exit 0)))) diff --git a/guix-data-service/jobs/load-new-guix-revision.scm b/guix-data-service/jobs/load-new-guix-revision.scm index 24fada7..4779d9a 100644 --- a/guix-data-service/jobs/load-new-guix-revision.scm +++ b/guix-data-service/jobs/load-new-guix-revision.scm @@ -719,10 +719,21 @@ ORDER BY load_new_guix_revision_jobs.id DESC") (list id))) (define (fetch-unlocked-jobs conn) - (exec-query - conn - " -SELECT id FROM load_new_guix_revision_jobs + (define query " +SELECT + id, + commit IN ( + SELECT commit FROM ( + SELECT DISTINCT ON (name) + name, git_branches.commit + FROM git_branches + WHERE + git_branches.git_repository_id = load_new_guix_revision_jobs.git_repository_id AND + git_branches.commit IS NOT NULL + ORDER BY name, datetime DESC + ) branches_and_latest_commits + ) AS latest_branch_commit +FROM load_new_guix_revision_jobs WHERE succeeded_at IS NULL AND NOT EXISTS ( @@ -731,8 +742,16 @@ WHERE -- Skip jobs that have failed, to avoid trying them over and over again WHERE job_id = load_new_guix_revision_jobs.id AND event = 'failure' ) -ORDER BY id DESC -FOR NO KEY UPDATE SKIP LOCKED")) +ORDER BY latest_branch_commit DESC, id DESC +FOR NO KEY UPDATE OF load_new_guix_revision_jobs +SKIP LOCKED") + + (map + (match-lambda + ((id priority) + (list id + (string=? priority "t")))) + (exec-query conn query))) (define (process-load-new-guix-revision-job id) (with-postgresql-connection