X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/66c13b6055a363cb08197b8c5d040ed9a511c8ca..181e90a0934d0057202b92010a96139df934aaf1:/services/nodemanager/arvnodeman/jobqueue.py?ds=inline diff --git a/services/nodemanager/arvnodeman/jobqueue.py b/services/nodemanager/arvnodeman/jobqueue.py index 0eb5b79e78..239934f529 100644 --- a/services/nodemanager/arvnodeman/jobqueue.py +++ b/services/nodemanager/arvnodeman/jobqueue.py @@ -38,10 +38,11 @@ class ServerCalculator(object): return True - def __init__(self, server_list, max_nodes=None): + def __init__(self, server_list, min_nodes=0, max_nodes=None): self.cloud_sizes = [self.CloudSizeWrapper(s, **kws) for s, kws in server_list] self.cloud_sizes.sort(key=lambda s: s.price) + self.min_nodes = min_nodes self.max_nodes = max_nodes or float('inf') self.logger = logging.getLogger('arvnodeman.jobqueue') self.logged_jobs = set() @@ -75,9 +76,16 @@ class ServerCalculator(object): if job['uuid'] not in self.logged_jobs: self.logged_jobs.add(job['uuid']) self.logger.debug("job %s not satisfiable", job['uuid']) - elif (want_count < self.max_nodes): + elif (want_count <= self.max_nodes): servers.extend([cloud_size.real] * max(1, want_count)) self.logged_jobs.intersection_update(seen_jobs) + + # Make sure the server queue has at least enough entries to + # satisfy min_nodes. + node_shortfall = self.min_nodes - len(servers) + if node_shortfall > 0: + basic_node = self.cloud_size_for_constraints({}) + servers.extend([basic_node.real] * node_shortfall) return servers