440
}
441
442
>
func (r *serviceResolver) ring() (*hashring.HashRing, map[string]*hostInfo) {
service_resolver.go
443
>
ring := r.ringAndHosts.Load().(ringAndHosts)
444
>
return ring.ring, ring.hosts
445
>
}
446
447
>
func (r *serviceResolver) compareMembers(hosts []*hostInfo) (map[string]*hostInfo, *membership.ChangedEvent) {
service_resolver.go
448
>
event := &membership.ChangedEvent{}
449
>
changed := false
450
>
_, prevHosts := r.ring() // note that this is always called with refreshLock so we can't miss an update here
451
>
newMembersMap := make(map[string]*hostInfo, len(hosts))
452
>
for _, host := range hosts {
453
>
newMembersMap[host.GetAddress()] = host
454
>
if prev, ok := prevHosts[host.GetAddress()]; !ok {
455
event.HostsAdded = append(event.HostsAdded, host)
456
changed = true
458
event.HostsChanged = append(event.HostsChanged, host)
459
changed = true
460
}
461
}
463
>
if _, ok := newMembersMap[addr]; !ok {
464
event.HostsRemoved = append(event.HostsRemoved, prev)
465
changed = true
466
}
467
}
469
>
return newMembersMap, event
470
>
}
471
return newMembersMap, nil
472
}