From: Michael Tremer Date: Tue, 14 Nov 2017 23:33:53 +0000 (+0000) Subject: hub: Allow to get a job without long-polling X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=654b5bacda918a5fa39724c60deec2f14fb51f90;p=pbs.git hub: Allow to get a job without long-polling Signed-off-by: Michael Tremer --- diff --git a/src/hub/__init__.py b/src/hub/__init__.py index 20bef7ff..360349d0 100644 --- a/src/hub/__init__.py +++ b/src/hub/__init__.py @@ -38,6 +38,7 @@ class Application(tornado.web.Application): # Builders (r"/builders/info", handlers.BuildersInfoHandler), + (r"/builders/jobs/get", handlers.BuildersGetNextJobHandler), (r"/builders/jobs/queue", handlers.BuildersJobsQueueHandler), (r"/builders/jobs/(.*)/addfile/(.*)", handlers.BuildersJobsAddFileHandler), (r"/builders/jobs/(.*)/buildroot", handlers.BuildersJobsBuildrootHandler), diff --git a/src/hub/handlers.py b/src/hub/handlers.py index aa4802c2..ce79ffb0 100644 --- a/src/hub/handlers.py +++ b/src/hub/handlers.py @@ -534,6 +534,48 @@ class BuildersKeepaliveHandler(BuildersBaseHandler): self.finish("OK") +class BuildersGetNextJobHandler(BuildersBaseHandler): + @tornado.web.authenticated + def get(self): + # XXX Set keepalive + + # If the builder is disabled, we don't need to do anything + # but will ask it to return after 5 min + if not self.builder.enabled: + self.set_header("Retry-After", "300") + return + + # If the builder has too many jobs running, + # we will tell it to return after 1 min + if self.builder.too_many_jobs: + self.set_header("Retry-After", "60") + return + + # Okay, we are ready for the next job + job = self.builder.get_next_job() + + # If we got no job, we will ask the builder + # to return after 30 seconds + if not job: + self.set_header("Retry-After", "30") + return + + # If we got a job, we will serialise it + # and send it to the builder + with self.db.transaction(): + job.start(builder=self.builder) + + ret = { + "id" : job.uuid, + "arch" : job.arch, + "source_url" : job.build.source_download, + "source_hash_sha512" : job.build.source_hash_sha512, + "type" : "test" if job.test else "release", + "config" : job.get_config(), + } + self.finish(ret) + + class BuildersJobsQueueHandler(BuildersBaseHandler): @tornado.web.asynchronous @tornado.web.authenticated