diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-11-04 11:28:27 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-11-04 11:28:27 +0000 |
commit | ae95b8f3dafb4845a6affa0cd6631adbd18fefa3 (patch) | |
tree | 16306f2032281a3ff2644ab1c5a26ff22d8ebfcc | |
parent | 9429341eced6fc8214a87b986da94aa5cf425934 (diff) | |
parent | 0c4417321bc395b623bcfdb39fa3043ebf3a2394 (diff) | |
download | tooz-ae95b8f3dafb4845a6affa0cd6631adbd18fefa3.tar.gz |
Merge "Handle when a group used to exist but no longer does"
-rw-r--r-- | tooz/drivers/redis.py | 12 | ||||
-rw-r--r-- | tooz/tests/test_coordination.py | 32 |
2 files changed, 42 insertions, 2 deletions
diff --git a/tooz/drivers/redis.py b/tooz/drivers/redis.py index 8b311ab..54da9d0 100644 --- a/tooz/drivers/redis.py +++ b/tooz/drivers/redis.py @@ -562,6 +562,10 @@ class RedisDriver(coordination.CoordinationDriver): encoded_group, value_from_callable=True)) + def _destroy_group(self, group_id): + """Should only be used in tests...""" + self._client.delete(self._encode_group_id(group_id)) + def get_groups(self): def _get_groups(): @@ -601,8 +605,12 @@ class RedisDriver(coordination.CoordinationDriver): def run_watchers(self, timeout=None): result = [] for group_id in self.get_groups().get(timeout=timeout): - group_members = set(self.get_members(group_id) - .get(timeout=timeout)) + try: + group_members = self.get_members(group_id).get(timeout=timeout) + except coordination.GroupNotCreated: + group_members = set() + else: + group_members = set(group_members) old_group_members = self._group_members.get(group_id, set()) for member_id in (group_members - old_group_members): result.extend( diff --git a/tooz/tests/test_coordination.py b/tooz/tests/test_coordination.py index 509f07d..69aa39b 100644 --- a/tooz/tests/test_coordination.py +++ b/tooz/tests/test_coordination.py @@ -330,6 +330,38 @@ class TestAPI(testscenarios.TestWithScenarios, self._coord.run_watchers() self.assertIsNone(self.event) + def test_watch_join_group_disappear(self): + if not hasattr(self._coord, '_destroy_group'): + self.skipTest("This test only works with coordinators" + " that have the ability to destroy groups.") + + self._coord.create_group(self.group_id).get() + self._coord.watch_join_group(self.group_id, self._set_event) + self._coord.watch_leave_group(self.group_id, self._set_event) + + member_id_test2 = self._get_random_uuid() + client2 = tooz.coordination.get_coordinator(self.url, + member_id_test2) + client2.start() + client2.join_group(self.group_id).get() + + while True: + if self._coord.run_watchers(): + break + self.assertIsInstance(self.event, + tooz.coordination.MemberJoinedGroup) + self.event = None + + # Force the group to disappear... + self._coord._destroy_group(self.group_id) + + while True: + if self._coord.run_watchers(): + break + + self.assertIsInstance(self.event, + tooz.coordination.MemberLeftGroup) + def test_watch_join_group_non_existent(self): self.assertRaises(tooz.coordination.GroupNotCreated, self._coord.watch_join_group, |