]> git.ipfire.org Git - pbs.git/commitdiff
builders: Make the job dispatch code slightly easier to read
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 27 Apr 2023 16:54:22 +0000 (16:54 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 27 Apr 2023 16:54:22 +0000 (16:54 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builders.py
src/buildservice/jobs.py

index a4db468c84b6684b2b1f4e1d45d79682b9ba09ec..c900a8a3fe698bd06d3a1c2588102a1ecb05e58c 100644 (file)
@@ -52,6 +52,24 @@ class Builders(base.Object):
                return self._get_builder("SELECT * FROM builders \
                        WHERE name = %s AND deleted IS FALSE", name)
 
+       @property
+       def connected(self):
+               """
+                       Returns all connected builders
+               """
+               # We do this so that we get a fresh builder object just in case
+               # some configuration has changed in the database.
+               for builder in self:
+                       # Skip disabled builders
+                       if not builder.enabled:
+                               continue
+
+                       # Skip all builders that don't have an open connection
+                       if not builder in self.connections:
+                               continue
+
+                       yield builder
+
        async def sync(self, *args, **kwargs):
                """
                        Synchronize any state with AWS
@@ -417,6 +435,12 @@ class Builder(base.DataObject):
 
        max_jobs = property(get_max_jobs, set_max_jobs)
 
+       def is_full(self):
+               """
+                       Returns True if the builder has enough jobs running
+               """
+               return len(self.jobs) >= self.max_jobs
+
        @property
        def name(self):
                return self.data.name
@@ -449,18 +473,6 @@ class Builder(base.DataObject):
        def host_key_id(self):
                return self.data.host_key_id
 
-       def is_ready(self):
-               # If the builder is not enabled, we are obviously not ready
-               if not self.enabled:
-                       return False
-
-               # Does this builder have reached its job limit?
-               if len(self.jobs) >= self.max_jobs:
-                       return False
-
-               # Looks like we are ready
-               return True
-
        # AWS
 
        @property
index fbc273755e1cc8d619df0376262d17c2c2de5e38..44028a1ae32ef239fa88ffef733157af7389edae 100644 (file)
@@ -157,9 +157,9 @@ class Queue(base.Object):
                builders = queue.SimpleQueue()
 
                # Add all builders to the queue in ascending order of running jobs
-               for builder in sorted(self.backend.builders.connections, key=lambda b: len(b.jobs)):
-                       # Skip builders that are not ready
-                       if not builder.is_ready():
+               for builder in sorted(self.backend.builders.connected, key=lambda b: len(b.jobs)):
+                       # Skip builders that are already full
+                       if builder.is_full():
                                continue
 
                        builders.put(builder)
@@ -191,7 +191,7 @@ class Queue(base.Object):
                        # If the builder has not any free slots remaining, we put it back in the
                        # queue to fill it up, but we give priority to builders who have fewer
                        # jobs to run.
-                       if len(builder.jobs) < builder.max_jobs:
+                       if not builder.is_full():
                                builders.put(builder)
 
                # Auto-scale builders