Use quota handling code for min-ready declines

We currently check the current pool nodes against max_servers in order
to decline min-ready request when we're at quota. This is older than
the quota handling where max-servers was the only limiting thing. Now
we have real quota handling we should defer this min-ready check to
the point where we know that we're at quota (independent of self
defined pool quota or real cloud quota).

Change-Id: Ic36ecfaf441436db6699297ef459c586f14c2dfc
This commit is contained in:
Tobias Henkel 2018-10-12 14:00:52 +02:00
parent 32b8f58df0
commit 552cc28f7f
No known key found for this signature in database
GPG Key ID: 03750DEC158E5FA2
1 changed files with 18 additions and 14 deletions

View File

@ -413,7 +413,10 @@ class NodeRequestHandler(NodeRequestHandlerNotifications,
diff = requested_types - saved_types
needed_types = list(diff.elements())
ready_nodes = self.zk.getReadyNodesOfTypes(needed_types)
if self.request.reuse:
ready_nodes = self.zk.getReadyNodesOfTypes(needed_types)
else:
ready_nodes = []
for ntype in needed_types:
# First try to grab from the list of already available nodes.
@ -455,6 +458,20 @@ class NodeRequestHandler(NodeRequestHandlerNotifications,
# If we calculate that we're at capacity, pause until nodes
# are released by Zuul and removed by the DeletedNodeWorker.
if not self.hasRemainingQuota(ntype):
if self.request.requestor == "NodePool:min-ready":
# The point of the min-ready nodes is to have nodes on
# standby for future requests. When at capacity, it
# doesn't make sense to wait for and use resources to
# speculatively create a node. Decline this so someone
# else with capacity can take it.
self.log.debug(
"Declining node request %s because provider cannot"
" satisfy min-ready")
self.decline_request()
self._declinedHandlerCleanup()
return
self.log.info(
"Not enough quota remaining to satisfy request %s",
self.request.id)
@ -531,19 +548,6 @@ class NodeRequestHandler(NodeRequestHandlerNotifications,
# This way we could give another (free) provider the chance to take
# this request earlier.
# For min-ready requests, which do not re-use READY nodes, let's
# decline if this provider is already at capacity. Otherwise, we
# could end up wedged until another request frees up a node.
if self.pool.max_servers is not None and \
self.request.requestor == "NodePool:min-ready":
current_count = self.zk.countPoolNodes(self.provider.name,
self.pool.name)
# Use >= because dynamic config changes to max-servers can leave
# us with more than max-servers.
# TODO: handle this with the quota code
if current_count >= self.pool.max_servers:
declined_reasons.append("provider cannot satisfy min-ready")
if declined_reasons:
self.log.debug("Declining node request %s because %s",
self.request.id, ', '.join(declined_reasons))