]> git.ipfire.org Git - pbs.git/commitdiff
Remember when builders are online
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 15 Nov 2017 00:02:15 +0000 (00:02 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 15 Nov 2017 00:02:15 +0000 (00:02 +0000)
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 <michael.tremer@ipfire.org>
src/buildservice/builders.py
src/database.sql
src/hub/handlers.py

index 59c6c72295e74ab410de482877a3ff153f50a83b..97de6121db88f74baf49b18183a8b5a91410329e 100644 (file)
@@ -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.
index 7a09c8918fa286111b2db8dfcf5fa8d8aebe1cbe..75bb7afa3a08d6db20b4e0d5800cd7f20153aff6 100644 (file)
@@ -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
 );
 
 
index ce79ffb09f9ccb46836e87d21e3983ce50b7f6a6..8d5131e736ee3eb5843d84cfee49d1b53d131177 100644 (file)
@@ -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