Use MulticastGroup as map key and serialize under lock

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-28 22:48:55 -08:00
parent 042ccab74e
commit aebd6f5e2c
4 changed files with 40 additions and 92 deletions

View File

@@ -65,13 +65,12 @@ func (n *Nodes) GetMulticastGroupMembers(groupIP net.IP) []*Node {
defer n.mu.RUnlock()
group := ParseMulticastGroup(groupIP)
groupKey := group.String()
var members []*Node
for _, node := range n.nodes {
if node.MulticastGroups == nil {
continue
}
if _, exists := node.MulticastGroups[groupKey]; exists {
if _, exists := node.MulticastGroups[group]; exists {
members = append(members, node)
}
}
@@ -93,9 +92,9 @@ func (n *Nodes) mergeMulticast(keep, merge *Node) {
if keep.MulticastGroups == nil {
keep.MulticastGroups = MulticastMembershipSet{}
}
for key, membership := range merge.MulticastGroups {
if existing, ok := keep.MulticastGroups[key]; !ok || membership.LastSeen.After(existing.LastSeen) {
keep.MulticastGroups[key] = membership
for group, lastSeen := range merge.MulticastGroups {
if existing, ok := keep.MulticastGroups[group]; !ok || lastSeen.After(existing) {
keep.MulticastGroups[group] = lastSeen
}
}
}