From e446eb5757137065e4ad66dbe4cd88a9e3923407 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 21 Feb 2018 14:04:40 -0500 Subject: [PATCH] Switch build queue limiter query to use total number of alive jobs This is slightly more accurate and, not being based on time, will work better under MySQL --- data/queue.py | 14 ++++++++------ endpoints/building.py | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/data/queue.py b/data/queue.py index 985d5852e..289f4ad64 100644 --- a/data/queue.py +++ b/data/queue.py @@ -74,18 +74,20 @@ class WorkQueue(object): ._available_jobs(now, name_match_query) .where(~(QueueItem.queue_name << running_query))) - def num_available_jobs(self, canonical_name_list): + def num_alive_jobs(self, canonical_name_list): """ - Returns the number of available queue items with a given prefix. + Returns the number of alive queue items with a given prefix. """ def strip_slash(name): return name.lstrip('/') canonical_name_list = map(strip_slash, canonical_name_list) + canonical_name_query = '/'.join([self._queue_name] + canonical_name_list) + '%' - available = self._available_jobs(datetime.utcnow(), - '/'.join([self._queue_name] + canonical_name_list) + '%') - - return available.count() + return (QueueItem + .select() + .where(QueueItem.queue_name ** canonical_name_query) + .where(QueueItem.retries_remaining > 0) + .count()) def num_available_jobs_between(self, available_min_time, available_max_time, canonical_name_list): """ diff --git a/endpoints/building.py b/endpoints/building.py index 8298f08ac..071f261a5 100644 --- a/endpoints/building.py +++ b/endpoints/building.py @@ -31,8 +31,8 @@ def start_build(repository, prepared_build, pull_robot_name=None): if repository.namespace_user.maximum_queued_builds_count is not None: queue_item_canonical_name = [repository.namespace_user.username] - available_builds = dockerfile_build_queue.num_available_jobs(queue_item_canonical_name) - if available_builds >= repository.namespace_user.maximum_queued_builds_count: + alive_builds = dockerfile_build_queue.num_alive_jobs(queue_item_canonical_name) + if alive_builds >= repository.namespace_user.maximum_queued_builds_count: logger.debug('Prevented queueing of build under namespace %s due to reaching max: %s', repository.namespace_user.username, repository.namespace_user.maximum_queued_builds_count)