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:
parent
9a169c1ec8
commit
8ad5cffc80
|
@ -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):
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue