Static driver: fix node registration

After fulfilling a node request from zuul, it was possible for the
static driver to not have an accurate representation of the nodes
that were registered in ZK. It needs to re-read from ZK on each
node deletion notification.

Change-Id: I82e6934edabcb0c720e15593fb38e8fcfafa121c
This commit is contained in:
David Shrewsbury
2018-06-22 12:00:58 -04:00
parent 236287588f
commit ac11c4592d
2 changed files with 41 additions and 5 deletions

View File

@@ -165,11 +165,11 @@ class StaticNodeProvider(Provider):
def _start(self, zk_conn):
self.zk = zk_conn
self.registered = self.getRegisteredNodeHostnames()
registered = self.getRegisteredNodeHostnames()
for pool in self.provider.pools.values():
for node in pool.nodes:
current_count = self.registered[node["name"]]
current_count = registered[node["name"]]
# Register nodes to synchronize with our configuration.
if current_count < node["max-parallel-jobs"]:
@@ -197,10 +197,10 @@ class StaticNodeProvider(Provider):
# De-register nodes to synchronize with our configuration.
# This case covers any registered nodes that no longer appear in
# the config.
for hostname in list(self.registered):
for hostname in list(registered):
if hostname not in self.static_nodes:
try:
self.deregisterNode(self.registered[hostname], hostname)
self.deregisterNode(registered[hostname], hostname)
except Exception:
self.log.exception("Couldn't deregister static node:")
continue
@@ -248,7 +248,13 @@ class StaticNodeProvider(Provider):
return
static_node = self.static_nodes[node.hostname]
current_count = self.registered[node.hostname]
try:
registered = self.getRegisteredNodeHostnames()
except Exception:
self.log.exception(
"Cannot get registered hostnames for node re-registration:")
return
current_count = registered[node.hostname]
# It's possible we were not able to de-register nodes due to a config
# change (because they were in use). In that case, don't bother to

View File

@@ -200,3 +200,33 @@ class TestDriverStatic(tests.DBTestCase):
req = self.waitForNodeRequest(req)
self.assertEqual(req.state, zk.FULFILLED)
self.assertEqual(len(req.nodes), 1)
def test_static_request_handled(self):
'''
Test that a node is reregistered after handling a request.
'''
configfile = self.setup_config('static-basic.yaml')
pool = self.useNodepool(configfile, watermark_sleep=1)
pool.start()
nodes = self.waitForNodes('fake-label')
self.assertEqual(len(nodes), 1)
req = zk.NodeRequest()
req.state = zk.REQUESTED
req.node_types.append('fake-label')
self.zk.storeNodeRequest(req)
self.log.debug("Waiting for request %s", req.id)
req = self.waitForNodeRequest(req)
self.assertEqual(req.state, zk.FULFILLED)
self.assertEqual(len(req.nodes), 1)
self.assertEqual(req.nodes[0], nodes[0].id)
# Mark node as used
nodes[0].state = zk.USED
self.zk.storeNode(nodes[0])
# Our single node should have been used, deleted, then reregistered
new_nodes = self.waitForNodes('fake-label')
self.assertEqual(len(new_nodes), 1)
self.assertEqual(nodes[0].hostname, new_nodes[0].hostname)