]> git.ipfire.org Git - pbs.git/commitdiff
jobs: Automatically abort jobs that have timed out
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 10 Feb 2025 15:30:39 +0000 (15:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 10 Feb 2025 15:30:39 +0000 (15:30 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/__init__.py
src/buildservice/jobs.py

index 69d6f8dd24c2548d2b8efd257a661b7049b3872a..f08ce70b9cd7fe042f7ee0edf11630c217c7a10f 100644 (file)
@@ -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()
index 6a007ec28d077cc66316707e28f29042a48a48b9..bab665647a616f7d7ae36fe81a51c3f46f5db7c1 100644 (file)
@@ -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()