From: Michael Tremer Date: Wed, 15 Nov 2017 00:02:15 +0000 (+0000) Subject: Remember when builders are online X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=571083299852e123ebdbf74876c1679c6078112a;p=pbs.git Remember when builders are online This will allow us to set a timeout until when we require the builder to return back. Until then we consider it being online and alive. Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/builders.py b/src/buildservice/builders.py index 59c6c722..97de6121 100644 --- a/src/buildservice/builders.py +++ b/src/buildservice/builders.py @@ -183,7 +183,7 @@ class Builder(base.DataObject): """ Returns True if the builder is online """ - return self.keepalive >= datetime.datetime.utcnow() - datetime.timedelta(minutes=1) + return self.online_until >= datetime.datetime.utcnow() @property def keepalive(self): @@ -204,6 +204,11 @@ class Builder(base.DataObject): WHERE id = %s", loadavg1, loadavg5, loadavg15, space_free, mem_total, mem_free, swap_total, swap_free, self.id) + def set_online_until(self, online_until): + self._set_attribute("online_until", online_until) + + online_until = property(lambda s: s.data.online_until, set_online_until) + def update_info(self, cpu_model=None, cpu_count=None, cpu_arch=None, cpu_bogomips=None, pakfire_version=None, host_key=None, os_name=None): # Update all the rest. diff --git a/src/database.sql b/src/database.sql index 7a09c891..75bb7afa 100644 --- a/src/database.sql +++ b/src/database.sql @@ -124,7 +124,8 @@ CREATE TABLE builders ( mem_free bigint, swap_total bigint, swap_free bigint, - space_free bigint + space_free bigint, + online_until timestamp without time zone ); diff --git a/src/hub/handlers.py b/src/hub/handlers.py index ce79ffb0..8d5131e7 100644 --- a/src/hub/handlers.py +++ b/src/hub/handlers.py @@ -535,21 +535,28 @@ class BuildersKeepaliveHandler(BuildersBaseHandler): class BuildersGetNextJobHandler(BuildersBaseHandler): + def _retry_after(self, seconds): + # Consider the builder online until the time has passed + self.builder.online_until = \ + datetime.datetime.utcnow() + datetime.timedelta(seconds=seconds) + + # Set the Retry-After header + self.set_header("Retry-After", "%s" % seconds) + + # Send empty response to client + self.finish() + @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 + return self._retry_after(300) # 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 + return self._retry_after(60) # Okay, we are ready for the next job job = self.builder.get_next_job() @@ -557,8 +564,7 @@ class BuildersGetNextJobHandler(BuildersBaseHandler): # 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 + return self._retry_after(30) # If we got a job, we will serialise it # and send it to the builder