in hashring/hashring.go [290:329]
func (r *HashRing) ProcessMembershipChanges(changes []membership.MemberChange) {
r.Lock()
changed := false
var added, updated, removed []string
for _, change := range changes {
if change.Before == nil && change.After != nil {
// new member
if r.addMemberNoLock(change.After) {
added = append(added, change.After.GetAddress())
changed = true
}
} else if change.Before != nil && change.After == nil {
// remove member
if r.removeMemberNoLock(change.Before) {
removed = append(removed, change.Before.GetAddress())
changed = true
}
} else {
if change.Before.Identity() != change.After.Identity() {
// identity has changed, member needs to be removed and readded
r.removeMemberNoLock(change.Before)
r.addMemberNoLock(change.After)
updated = append(updated, change.After.GetAddress())
changed = true
}
}
}
// recompute checksums on changes
if changed {
r.computeChecksumsNoLock()
r.EmitEvent(events.RingChangedEvent{
ServersAdded: added,
ServersUpdated: updated,
ServersRemoved: removed,
})
}
r.Unlock()
}