From: Michael Tremer Date: Thu, 27 Apr 2023 16:54:22 +0000 (+0000) Subject: builders: Make the job dispatch code slightly easier to read X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=16e2b3ea9a175ad423a10baedc22eb66b756e936;p=pbs.git builders: Make the job dispatch code slightly easier to read Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/builders.py b/src/buildservice/builders.py index a4db468c..c900a8a3 100644 --- a/src/buildservice/builders.py +++ b/src/buildservice/builders.py @@ -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 diff --git a/src/buildservice/jobs.py b/src/buildservice/jobs.py index fbc27375..44028a1a 100644 --- a/src/buildservice/jobs.py +++ b/src/buildservice/jobs.py @@ -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