in swim/memberlist.go [418:461]
func (m *memberlist) updateLocalMember(update func(*Member) bool) {
m.members.Lock()
before := *m.local
didUpdate := update(m.local)
// exit if the update didn't change anything
if !didUpdate {
m.members.Unlock()
return
}
// bump incarnation number if the member has been updated
change := m.bumpIncarnation()
changes := []Change{change}
after := *m.local
m.members.Unlock()
// since we changed our local state we need to update our checksum
m.ComputeChecksum()
// kick in our updating mechanism
m.node.handleChanges(changes)
// prepare a membership change event for observable state changes
var memberChange membership.MemberChange
if before.isReachable() {
memberChange.Before = before
}
if after.isReachable() {
memberChange.After = after
}
if memberChange.Before != nil || memberChange.After != nil {
m.node.EmitEvent(membership.ChangeEvent{
Changes: []membership.MemberChange{
memberChange,
},
})
}
}