]> git.ipfire.org Git - pbs.git/commitdiff
builds/jobs: Launch them only after the db transaction as been committed
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 3 May 2023 15:45:38 +0000 (15:45 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 3 May 2023 15:45:38 +0000 (15:45 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builds.py
src/buildservice/jobs.py
src/scripts/pakfire-build-service
src/web/builds.py
src/web/jobs.py

index 060a9656ac0f5fbd10cf18e48709b173fc527316..1e028010f9e8d759ec14bb893ff8eaa37057b5e0 100644 (file)
@@ -249,6 +249,14 @@ class Builds(base.Object):
 
                return build
 
+       async def launch(self, builds):
+               """
+                       Called to launch all given builds
+               """
+               # Launch all jobs
+               for build in builds:
+                       await self.backend.jobs.launch(build.jobs)
+
        # Groups
 
        @lazy_property
index 092033a39b20c176fa0b9bdaa29b7d1f1cca18f3..f865ba77f277116cb4f711568f19a5785ac6cbd1 100644 (file)
@@ -93,7 +93,7 @@ class Jobs(base.Object):
 
                return list(jobs)
 
-       async def launch(self, *jobs):
+       async def launch(self, jobs):
                """
                        Called to launch all given jobs
                """
@@ -465,7 +465,7 @@ class Job(base.DataObject):
                                )
 
                # Propagate any changes to the build
-               await self.build._job_finished(job=self)
+               return await self.build._job_finished(job=self)
 
        def is_pending(self):
                if self.has_finished():
@@ -600,10 +600,7 @@ class Job(base.DataObject):
                        raise RuntimeError("Job %s cannot be retried" % self)
 
                # Clone the job
-               job = self.clone()
-
-               # Launch the newly created job
-               self.backend.run_task(self.backend.jobs.launch, job)
+               return self.clone()
 
        # Log
 
index d3b89ff577f0b8f5efdf4a09d6e64fffc95a0cbb..331bfd5df6194b990c4d06fdfbfe9cc28f27c0eb 100644 (file)
@@ -157,7 +157,10 @@ class Cli(object):
                                continue
 
                        with self.backend.db.transaction():
-                               await build.create_test_builds()
+                               builds = await build.create_test_builds()
+
+                       # Launch all builds
+                       await self.backend.builds.launch(builds)
 
 
 async def main():
index 6220a55bb4feb276873e35dc0f4d89af0cd26eb2..ff1694d8434ff0f0b4def9add1c765d36aa5a499 100644 (file)
@@ -53,7 +53,7 @@ class APIv1IndexHandler(base.APIMixin, base.BaseHandler):
                })
 
                # Launch all jobs (in the background)
-               self.backend.run_task(self.backend.jobs.launch, *build.jobs)
+               self.backend.run_task(self.backend.builds.launch, [build])
 
 
 class IndexHandler(base.BaseHandler):
index 5dece72113798ff88d388d671da32ad27ce7be46..2811917c4f03effc8f0539dd50271da7a0932057 100644 (file)
@@ -82,11 +82,16 @@ class APIv1DetailHandler(base.APIMixin, tornado.websocket.WebSocketHandler):
 
                # Mark the job as finished
                with self.db.transaction():
-                       await self.job.finished(success=success, logfile=logfile, packages=packages)
+                       builds = await self.job.finished(success=success,
+                               logfile=logfile, packages=packages)
 
                # Try to dispatch the next job
                self.backend.run_task(self.backend.jobs.queue.dispatch)
 
+               # Launch any (test) builds
+               if builds:
+                       self.backend.run_task(self.backend.builds.launch, builds)
+
 
 class APIv1LogStreamHandler(base.BackendMixin, tornado.websocket.WebSocketHandler):
        # No authentication required
@@ -226,7 +231,10 @@ class RetryHandler(base.BaseHandler):
                        raise tornado.web.HTTPError(404, "Could not find job %s" % uuid)
 
                with self.db.transaction():
-                       await job.retry(self.current_user)
+                       job = await job.retry(self.current_user)
+
+               # Launch the newly created job
+               self.backend.run_task(self.backend.jobs.launch, [job])
 
                # Redirect back to the build page
                self.redirect("/builds/%s" % job.build.uuid)