summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-11-04 11:28:27 +0000
committerGerrit Code Review <review@openstack.org>2014-11-04 11:28:27 +0000
commitae95b8f3dafb4845a6affa0cd6631adbd18fefa3 (patch)
tree16306f2032281a3ff2644ab1c5a26ff22d8ebfcc
parent9429341eced6fc8214a87b986da94aa5cf425934 (diff)
parent0c4417321bc395b623bcfdb39fa3043ebf3a2394 (diff)
downloadtooz-ae95b8f3dafb4845a6affa0cd6631adbd18fefa3.tar.gz
Merge "Handle when a group used to exist but no longer does"
-rw-r--r--tooz/drivers/redis.py12
-rw-r--r--tooz/tests/test_coordination.py32
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,