diff options
author | Jim Rollenhagen <jim@jimrollenhagen.com> | 2014-10-07 16:24:31 -0700 |
---|---|---|
committer | Devananda van der Veen <devananda.vdv@gmail.com> | 2014-10-08 12:50:25 -0700 |
commit | 3807e9447634c5ce6d9f65cac48ddc9bc0f9d295 (patch) | |
tree | 598d99585268d66d9cb470ea062501f77ee18cb7 | |
parent | 5a9ad649bb7047010b4ea09d5e399f58597303ca (diff) | |
download | ironic-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.py | 4 | ||||
-rw-r--r-- | ironic/tests/conductor/test_rpcapi.py | 31 |
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') |