memcached: delete stale/dead group members on get_members()

Closes-Bug: #1386846
Change-Id: Ieab24b57a5012e63fc1c4bd0997f706d7d9067a2
This commit is contained in:
Julien Danjou 2014-12-01 14:44:57 +01:00
parent e153202ca0
commit 553518403c
1 changed files with 15 additions and 3 deletions

View File

@ -229,12 +229,24 @@ class MemcachedDriver(coordination.CoordinationDriver):
return MemcachedFutureResult(self._executor.submit(_leave_group))
@_retry.retry
def _get_members(self, group_id):
group_members = self.client.get(self._encode_group_id(group_id))
encoded_group = self._encode_group_id(group_id)
group_members, cas = self.client.gets(encoded_group)
if group_members is None:
raise coordination.GroupNotCreated(group_id)
return dict((m, v) for m, v in six.iteritems(group_members)
if self.client.get(self._encode_member_id(m)))
actual_group_members = {}
for m, v in six.iteritems(group_members):
# Never kick self from the group, we know we're alive
if (m == self._member_id
or self.client.get(self._encode_member_id(m))):
actual_group_members[m] = v
if group_members != actual_group_members:
# There are some dead members, update the group
if not self.client.cas(encoded_group, actual_group_members, cas):
# It changed, let's try again
raise _retry.Retry
return actual_group_members
def get_members(self, group_id):
def _get_members():