From 709118bc9efe94096bd3dc3d8640fa1036e37f31 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 17 Oct 2017 15:00:21 +0100 Subject: [PATCH] Add command to restart any failed builds Signed-off-by: Michael Tremer --- src/buildservice/builds.py | 21 +++++++++++++++++++ src/manager/__init__.py | 2 +- src/manager/builds.py | 34 ------------------------------- src/scripts/pakfire-build-service | 3 +++ src/scripts/pakfire-manager | 2 -- 5 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/buildservice/builds.py b/src/buildservice/builds.py index fae1032..0ffdeca 100644 --- a/src/buildservice/builds.py +++ b/src/buildservice/builds.py @@ -1468,6 +1468,27 @@ class Jobs(base.Object): if jobs: return jobs.count + def restart_failed(self, max_tries=9): + jobs = self._get_jobs("SELECT jobs.* FROM jobs \ + JOIN builds ON builds.id = jobs.build_id \ + WHERE \ + jobs.type = 'build' AND \ + jobs.state = 'failed' AND \ + jobs.tries <= %s AND \ + NOT builds.state = 'broken' AND \ + jobs.time_finished < NOW() - '72 hours'::interval \ + ORDER BY \ + CASE \ + WHEN jobs.type = 'build' THEN 0 \ + WHEN jobs.type = 'test' THEN 1 \ + END, \ + builds.priority DESC, jobs.time_created ASC", + max_tries) + + # Restart the job + for job in jobs: + job.set_state("new", log=False) + class Job(base.DataObject): table = "jobs" diff --git a/src/manager/__init__.py b/src/manager/__init__.py index 4a9b735..69eb8fa 100644 --- a/src/manager/__init__.py +++ b/src/manager/__init__.py @@ -1,4 +1,4 @@ #!/usr/bin/python -from .builds import BuildsFailedRestartEvent, CheckBuildDependenciesEvent +from .builds import CheckBuildDependenciesEvent from .builds import DistEvent diff --git a/src/manager/builds.py b/src/manager/builds.py index 9ff85d2..4ae9bcf 100644 --- a/src/manager/builds.py +++ b/src/manager/builds.py @@ -14,40 +14,6 @@ from . import base from ..constants import * -class BuildsFailedRestartEvent(base.Event): - # Run when idle. - priority = 5 - - @property - def interval(self): - return self.pakfire.settings.get_int("build_keepalive_interval", 900) - - def run(self): - max_tries = self.pakfire.settings.get_int("builds_restart_max_tries", 9) - - query = self.db.query("SELECT jobs.id AS id FROM jobs \ - JOIN builds ON builds.id = jobs.build_id \ - WHERE \ - jobs.type = 'build' AND \ - jobs.state = 'failed' AND \ - jobs.tries <= %s AND \ - NOT builds.state = 'broken' AND \ - jobs.time_finished < NOW() - '72 hours'::interval \ - ORDER BY \ - CASE \ - WHEN jobs.type = 'build' THEN 0 \ - WHEN jobs.type = 'test' THEN 1 \ - END, \ - builds.priority DESC, jobs.time_created ASC", - max_tries) - - for row in query: - job = self.pakfire.jobs.get_by_id(row.id) - - # Restart the job. - job.set_state("new", log=False) - - class CheckBuildDependenciesEvent(base.Event): # Process them as quickly as possible, but there may be more important events. priority = 3 diff --git a/src/scripts/pakfire-build-service b/src/scripts/pakfire-build-service index 470af17..2ef005b 100644 --- a/src/scripts/pakfire-build-service +++ b/src/scripts/pakfire-build-service @@ -41,6 +41,9 @@ class Cli(object): # Remaster Repositories "remaster-repositories" : self.backend.repos.remaster, + # Restart failed jobs + "restart-failed-jobs" : self.backend.jobs.restart_failed, + # Send bug updates to Bugzilla "send-bug-updates" : self.backend.bugzilla.send_all, } diff --git a/src/scripts/pakfire-manager b/src/scripts/pakfire-manager index 9e9dac8..a758c00 100644 --- a/src/scripts/pakfire-manager +++ b/src/scripts/pakfire-manager @@ -16,10 +16,8 @@ s = pakfire.buildservice.scheduler.Scheduler() p = pakfire.buildservice.Pakfire() events = ( - pakfire.buildservice.manager.BuildsFailedRestartEvent, pakfire.buildservice.manager.CheckBuildDependenciesEvent, pakfire.buildservice.manager.DistEvent, - pakfire.buildservice.manager.RepositoriesUpdateEvent, ) # Add all events to the scheduler. -- 2.39.2