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
This commit is contained in:
Adam Gandelman 2015-12-23 12:50:09 -08:00
parent 9a169c1ec8
commit 8ad5cffc80
3 changed files with 32 additions and 2 deletions

View File

@ -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):

View File

@ -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')

View File

@ -0,0 +1,3 @@
---
fixes:
- Bug `1535857 <https://bugs.launchpad.net/astara/+bug/1535857/>`_ The additional \"leadership\" member reported by zookeeper is now ignored to avoid hashing resources to a non-existent node.