From: Michael Tremer Date: Mon, 10 Feb 2025 15:30:39 +0000 (+0000) Subject: jobs: Automatically abort jobs that have timed out X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=870fc1a90af46b8d7ff58f05218b6f7cad6fd05a;p=pbs.git jobs: Automatically abort jobs that have timed out Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/__init__.py b/src/buildservice/__init__.py index 69d6f8dd..f08ce70b 100644 --- a/src/buildservice/__init__.py +++ b/src/buildservice/__init__.py @@ -116,7 +116,7 @@ class Backend(object): self.run_periodic_task(3600, self.cleanup) # Automatically abort any jobs that run for forever - #self.run_periodic_task(60, self.jobs.abort) + self.run_periodic_task(60, self.jobs.abort) def read_config(self, path): c = configparser.ConfigParser() diff --git a/src/buildservice/jobs.py b/src/buildservice/jobs.py index 6a007ec2..bab66564 100644 --- a/src/buildservice/jobs.py +++ b/src/buildservice/jobs.py @@ -177,25 +177,29 @@ class Jobs(base.Object): """ log.debug("Aborting timed-out jobs...") - jobs = self._get_jobs(""" - SELECT - * - FROM - jobs - WHERE - deleted_at IS NULL - AND - finished_at IS NULL - AND - started_at IS NOT NULL - AND - timeout IS NOT NULL - AND - started_at + timeout < CURRENT_TIMESTAMP - """) + stmt = ( + sqlalchemy + .select( + Job + ) + .where( + # Don't care about deleted jobs + Job.deleted_at == None, + + # Jobs must be running + Job.started_at != None, + Job.finished_at == None, + + # Jobs must have a timeout + Job.timeout != None, + + # The timeout must have passed + Job.started_at + Job.timeout < sqlalchemy.func.current_timestamp(), + ) + ) # Abort them all... - async for job in jobs: + async for job in self.db.fetch(stmt): await job.abort()