summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Rollenhagen <jim@jimrollenhagen.com>2014-10-07 16:24:31 -0700
committerDevananda van der Veen <devananda.vdv@gmail.com>2014-10-08 12:50:25 -0700
commit3807e9447634c5ce6d9f65cac48ddc9bc0f9d295 (patch)
tree598d99585268d66d9cb470ea062501f77ee18cb7
parent5a9ad649bb7047010b4ea09d5e399f58597303ca (diff)
downloadironic-3807e9447634c5ce6d9f65cac48ddc9bc0f9d295.tar.gz
Clear hash ring cache in get_topic_for*2014.2.rc2
This causes the hash ring to be reset on each API request, avoiding an issue where a new conductor never joins the ring until the API service is restarted. Closes-Bug: 1378570 Change-Id: Ic57370163f2f833efab662837036298f29f4ca90
-rw-r--r--ironic/conductor/rpcapi.py4
-rw-r--r--ironic/tests/conductor/test_rpcapi.py31
2 files changed, 35 insertions, 0 deletions
diff --git a/ironic/conductor/rpcapi.py b/ironic/conductor/rpcapi.py
index 4fa96f1aa..452fc0cee 100644
--- a/ironic/conductor/rpcapi.py
+++ b/ironic/conductor/rpcapi.py
@@ -87,6 +87,8 @@ class ConductorAPI(object):
:raises: NoValidHost
"""
+ self.ring_manager.reset()
+
try:
ring = self.ring_manager[node.driver]
dest = ring.get_hosts(node.uuid)
@@ -106,6 +108,8 @@ class ConductorAPI(object):
:raises: DriverNotFound
"""
+ self.ring_manager.reset()
+
hash_ring = self.ring_manager[driver_name]
host = random.choice(list(hash_ring.hosts))
return self.topic + "." + host
diff --git a/ironic/tests/conductor/test_rpcapi.py b/ironic/tests/conductor/test_rpcapi.py
index 2715649d6..47a938c47 100644
--- a/ironic/tests/conductor/test_rpcapi.py
+++ b/ironic/tests/conductor/test_rpcapi.py
@@ -78,6 +78,22 @@ class RPCAPITestCase(base.DbTestCase):
rpcapi.get_topic_for,
self.fake_node_obj)
+ def test_get_topic_doesnt_cache(self):
+ CONF.set_override('host', 'fake-host')
+
+ rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic')
+ self.assertRaises(exception.NoValidHost,
+ rpcapi.get_topic_for,
+ self.fake_node_obj)
+
+ self.dbapi.register_conductor({'hostname': 'fake-host',
+ 'drivers': ['fake-driver']})
+
+ rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic')
+ expected_topic = 'fake-topic.fake-host'
+ self.assertEqual(expected_topic,
+ rpcapi.get_topic_for(self.fake_node_obj))
+
def test_get_topic_for_driver_known_driver(self):
CONF.set_override('host', 'fake-host')
self.dbapi.register_conductor({
@@ -99,6 +115,21 @@ class RPCAPITestCase(base.DbTestCase):
rpcapi.get_topic_for_driver,
'fake-driver')
+ def test_get_topic_for_driver_doesnt_cache(self):
+ CONF.set_override('host', 'fake-host')
+ rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic')
+ self.assertRaises(exception.DriverNotFound,
+ rpcapi.get_topic_for_driver,
+ 'fake-driver')
+
+ self.dbapi.register_conductor({
+ 'hostname': 'fake-host',
+ 'drivers': ['fake-driver'],
+ })
+ rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic')
+ self.assertEqual('fake-topic.fake-host',
+ rpcapi.get_topic_for_driver('fake-driver'))
+
def _test_rpcapi(self, method, rpc_method, **kwargs):
rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic')