From 8ad5cffc802845f4a1f68440a963b99eac935b0f Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Wed, 23 Dec 2015 12:50:09 -0800 Subject: [PATCH] Filter the 'leader' member from cluster membership list When configured to use zookeeper, tooz reports an additional member named 'leader' in its membership list. This can mess with construction of the hash table. This removes it from the list of members we use for the DHT. Closes-Bug: #1535857 Change-Id: I1d3d7c27984c99c46d6d26e0b9f21c3b5a511617 --- astara/coordination.py | 13 +++++++++++-- astara/test/unit/test_coordination.py | 18 ++++++++++++++++++ ..._zk_leadership_member-2cf3736e67d19b27.yaml | 3 +++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/ignore_zk_leadership_member-2cf3736e67d19b27.yaml diff --git a/astara/coordination.py b/astara/coordination.py index ac5840bf..8fb496a0 100644 --- a/astara/coordination.py +++ b/astara/coordination.py @@ -104,7 +104,7 @@ class RugCoordinator(object): self._coordinator.watch_join_group(self.group, self.cluster_changed) self._coordinator.watch_leave_group(self.group, self.cluster_changed) self._coordinator.heartbeat() - LOG.debug("Sending initial event changed for members; %s" % + LOG.debug("Sending initial event changed for members: %s" % self.members) self.cluster_changed(event=None, node_bootstrap=True) @@ -140,7 +140,16 @@ class RugCoordinator(object): @property def members(self): """Returns the current cluster membership list""" - return self._coordinator.get_members(self.group).get() + members = self._coordinator.get_members(self.group).get() + + # tooz ZK driver reports 'leader' as a member, which can screw with + # hashing. + try: + members.remove('leader') + except ValueError: + pass + + return members @property def is_leader(self): diff --git a/astara/test/unit/test_coordination.py b/astara/test/unit/test_coordination.py index 0894706b..a4376377 100644 --- a/astara/test/unit/test_coordination.py +++ b/astara/test/unit/test_coordination.py @@ -107,6 +107,24 @@ class TestRugCoordinator(base.RugTestBase): self.assertEqual(self.coordinator.members, ['foo', 'bar']) self.fake_coord.get_members.assert_called_with(self.coordinator.group) + def test_members_filter_leader(self): + fake_async_resp = mock.MagicMock( + get=mock.MagicMock(return_value=['foo', 'bar', 'leader']) + ) + self.fake_coord.get_members.return_value = fake_async_resp + self.coordinator = coordination.RugCoordinator(self.queue) + self.assertEqual(self.coordinator.members, ['foo', 'bar']) + self.fake_coord.get_members.assert_called_with(self.coordinator.group) + + def test_members_filter_no_leader(self): + fake_async_resp = mock.MagicMock( + get=mock.MagicMock(return_value=['foo', 'bar']) + ) + self.fake_coord.get_members.return_value = fake_async_resp + self.coordinator = coordination.RugCoordinator(self.queue) + self.assertEqual(self.coordinator.members, ['foo', 'bar']) + self.fake_coord.get_members.assert_called_with(self.coordinator.group) + def test_is_leader(self): fake_async_resp = mock.MagicMock( get=mock.MagicMock(return_value='foo_host') diff --git a/releasenotes/notes/ignore_zk_leadership_member-2cf3736e67d19b27.yaml b/releasenotes/notes/ignore_zk_leadership_member-2cf3736e67d19b27.yaml new file mode 100644 index 00000000..96997617 --- /dev/null +++ b/releasenotes/notes/ignore_zk_leadership_member-2cf3736e67d19b27.yaml @@ -0,0 +1,3 @@ +--- +fixes: + - Bug `1535857 `_ The additional \"leadership\" member reported by zookeeper is now ignored to avoid hashing resources to a non-existent node.