fix(nsc): Overly eager IPVS updating

* fix(nsc): Overly eager IPVS updating

Switches the endpoint map comparison in OnEndpointsUpdate from being a
DeepEqual, to instead checking that all services exist, and that their
associated endpoints are similar.

Ordering is no longer considered important in regards to the IPVS
update check.

Fixes #1026
This commit is contained in:
Alexander "Ananace" Olofsson 2021-04-22 00:25:16 +02:00 committed by GitHub
parent f0e1a13b09
commit bd5ee4f708
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -813,6 +813,48 @@ func (nsc *NetworkServicesController) publishMetrics(serviceInfoMap serviceInfoM
return nil return nil
} }
// TODO Move to utils
func unsortedListsEquivalent(a, b []endpointsInfo) bool {
if len(a) != len(b) {
return false
}
values := make(map[interface{}]int)
for _, val := range a {
values[val] = 1
}
for _, val := range b {
values[val] = values[val] + 1
}
for _, val := range values {
if val == 1 {
return false
}
}
return true
}
func endpointsMapsEquivalent(a, b endpointsInfoMap) bool {
if len(a) != len(b) {
return false
}
for key, valA := range a {
valB, ok := b[key]
if !ok {
return false
}
if !unsortedListsEquivalent(valA, valB) {
return false
}
}
return true
}
// OnEndpointsUpdate handle change in endpoints update from the API server // OnEndpointsUpdate handle change in endpoints update from the API server
func (nsc *NetworkServicesController) OnEndpointsUpdate(ep *api.Endpoints) { func (nsc *NetworkServicesController) OnEndpointsUpdate(ep *api.Endpoints) {
@ -850,7 +892,7 @@ func (nsc *NetworkServicesController) OnEndpointsUpdate(ep *api.Endpoints) {
newServiceMap := nsc.buildServicesInfo() newServiceMap := nsc.buildServicesInfo()
newEndpointsMap := nsc.buildEndpointsInfo() newEndpointsMap := nsc.buildEndpointsInfo()
if len(newEndpointsMap) != len(nsc.endpointsMap) || !reflect.DeepEqual(newEndpointsMap, nsc.endpointsMap) { if !endpointsMapsEquivalent(newEndpointsMap, nsc.endpointsMap) {
nsc.endpointsMap = newEndpointsMap nsc.endpointsMap = newEndpointsMap
nsc.serviceMap = newServiceMap nsc.serviceMap = newServiceMap
klog.V(1).Infof("Syncing IPVS services sync for update to endpoint: %s/%s", ep.Namespace, ep.Name) klog.V(1).Infof("Syncing IPVS services sync for update to endpoint: %s/%s", ep.Namespace, ep.Name)