From e8def40a4149651b69d0ed8fa1bdbbb431912f27 Mon Sep 17 00:00:00 2001 From: joyce Date: Fri, 13 Feb 2015 16:21:30 +0800 Subject: [PATCH] Fix matchmaker_redis ack_alive fails with KeyError Fix matchmaker_redis: ack_alive fails with KeyError on re-registration attempt. def ack_alive(self, key, host): topic = "%s.%s" % (key, host) if not self.redis.expire(topic, CONF.matchmaker_heartbeat_ttl): # If we could not update the expiration, the key # might have been pruned. Re-register, creating a new # key in Redis. self.register(self.host_topic[host], host) self.host_topic is a dict with keys of tuple (key, host), not 'host', register's first parameter is the topic like 'notification-info', so modify it to key. And it will not cause indefinite recursion, because when register end, the key exist in redis, redis.expire will return True. Add test case for ack_alive. Closes-Bug: #1419718 Change-Id: I8d972afe89aec02a5c8f0d9dd4e216bc12c298a1 --- oslo_messaging/_drivers/matchmaker_redis.py | 2 +- oslo_messaging/tests/drivers/test_matchmaker_redis.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/oslo_messaging/_drivers/matchmaker_redis.py b/oslo_messaging/_drivers/matchmaker_redis.py index 4ba5447c5..4f6e6f0df 100644 --- a/oslo_messaging/_drivers/matchmaker_redis.py +++ b/oslo_messaging/_drivers/matchmaker_redis.py @@ -105,7 +105,7 @@ class MatchMakerRedis(mm_common.HeartbeatMatchMakerBase): # If we could not update the expiration, the key # might have been pruned. Re-register, creating a new # key in Redis. - self.register(self.host_topic[host], host) + self.register(key, host) def is_alive(self, topic, host): if self.redis.ttl(host) == -1: diff --git a/oslo_messaging/tests/drivers/test_matchmaker_redis.py b/oslo_messaging/tests/drivers/test_matchmaker_redis.py index 9110296fa..097029d42 100644 --- a/oslo_messaging/tests/drivers/test_matchmaker_redis.py +++ b/oslo_messaging/tests/drivers/test_matchmaker_redis.py @@ -81,3 +81,9 @@ class RedisMatchMakerTest(test_utils.BaseTestCase): self.assertEqual( sorted(self.matcher.redis.smembers('conductor')), ['conductor.node1', 'conductor.node2', 'conductor.node3']) + + def test_ack_alive(self): + self.matcher.ack_alive('ack_alive', 'controller1') + self.assertEqual( + sorted(self.matcher.redis.smembers('ack_alive')), + ['ack_alive.controller1'])