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.