Skip to content

Commit 31c3b2b

Browse files
committed
feat: requeue pipeline runs missing from queue
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 0d9fe1a commit 31c3b2b

2 files changed

Lines changed: 47 additions & 11 deletions

File tree

‎vulnerabilities/schedules.py‎

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,34 @@ def mark_stale_runs():
124124

125125
from vulnerabilities.models import PipelineRun
126126

127-
for job in PipelineRun.objects.filter(run_start_date__isnull=False).filter(
127+
stale_jobs = PipelineRun.objects.filter(run_start_date__isnull=False).filter(
128128
Q(run_end_date__isnull=True) | Q(run_exitcode__isnull=True)
129-
):
129+
)
130+
stale_jobs_count = stale_jobs.count()
131+
132+
for job in stale_jobs.iterator(chunk_size=1000):
130133
job.set_run_staled()
131134

135+
log.info(f"Marked {stale_jobs_count} unfinished jobs as stale.")
136+
137+
138+
def requeue_missing_jobs():
139+
"""Requeue pipeline runs that have not started and are missing from the queue."""
140+
141+
from vulnerabilities.models import PipelineRun
142+
from vulnerabilities.tasks import enqueue_run
143+
from vulnerabilities.tasks import is_job_in_queue
144+
145+
missing_jobs_count = 0
146+
for job in PipelineRun.objects.filter(run_start_date__isnull=True).iterator(chunk_size=1000):
147+
if not is_job_in_queue(job_id=job.run_id):
148+
enqueue_run(run=job)
149+
missing_jobs_count += 1
150+
151+
log.info(f"Requeued {missing_jobs_count} missing jobs.")
152+
132153

133154
def refresh_runs():
155+
"""Refresh the stale and missing jobs."""
134156
mark_stale_runs()
157+
requeue_missing_jobs()

‎vulnerabilities/tasks.py‎

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,22 @@ def set_run_failure(job, connection, type, value, traceback):
115115
run.set_run_ended(exitcode=1, output=f"value={value} trace={traceback}")
116116

117117

118+
def enqueue_run(run):
119+
pipeline_schedule = run.pipeline
120+
queue = queues.get(pipeline_schedule.get_run_priority_display())
121+
122+
job = queue.enqueue(
123+
execute_pipeline,
124+
pipeline_schedule.pipeline_id,
125+
run.run_id,
126+
job_id=str(run.run_id),
127+
on_failure=set_run_failure,
128+
job_timeout=f"{pipeline_schedule.execution_timeout}h",
129+
)
130+
131+
118132
def enqueue_pipeline(pipeline_id):
119133
pipeline_schedule = models.PipelineSchedule.objects.get(pipeline_id=pipeline_id)
120-
queue = queues.get(pipeline_schedule.get_run_priority_display())
121134

122135
if pipeline_schedule.status in [
123136
models.PipelineRun.Status.RUNNING,
@@ -134,14 +147,8 @@ def enqueue_pipeline(pipeline_id):
134147
run = models.PipelineRun.objects.create(
135148
pipeline=pipeline_schedule,
136149
)
137-
job = queue.enqueue(
138-
execute_pipeline,
139-
pipeline_id,
140-
run.run_id,
141-
job_id=str(run.run_id),
142-
on_failure=set_run_failure,
143-
job_timeout=f"{pipeline_schedule.execution_timeout}h",
144-
)
150+
151+
enqueue_run(run)
145152

146153

147154
def dequeue_job(job_id):
@@ -152,6 +159,12 @@ def dequeue_job(job_id):
152159
queue.remove(job_id)
153160

154161

162+
def is_job_in_queue(job_id):
163+
"""Return whether a job exists in any queue."""
164+
165+
return any(job_id in queue.jobs for queue in queues.values())
166+
167+
155168
def compute_queue_load_factor():
156169
"""
157170
Compute worker load per queue.

0 commit comments

Comments
 (0)