Skip to content

Commit 188309d

Browse files
committed
Perf optimization: Stop every node event from triggering EIP Node update
Everytime the node updates it is triggering addEgressNode, which does a route add operation libovsdb txn for default network and every UDN, initiated from the default controller egress node logic. Only runs when needed now. Signed-off-by: Tim Rozet <[email protected]>
1 parent d9ba339 commit 188309d

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

go-controller/pkg/ovn/default_network_controller.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ type DefaultNetworkController struct {
131131
syncZoneICFailed sync.Map
132132
syncHostNetAddrSetFailed sync.Map
133133
syncEIPNodeRerouteFailed sync.Map
134+
syncEIPNodeFailed sync.Map
134135

135136
// variable to determine if all pods present on the node during startup have been processed
136137
// updated atomically
@@ -843,8 +844,10 @@ func (h *defaultNetworkControllerEventHandler) AddResource(obj interface{}, from
843844
h.oc.eIPC.nodeZoneState.UnlockKey(node.Name)
844845

845846
shouldSyncReroute := true
847+
shouldSyncEIPNode := true
846848
if fromRetryLoop {
847849
_, shouldSyncReroute = h.oc.syncEIPNodeRerouteFailed.Load(node.Name)
850+
_, shouldSyncEIPNode = h.oc.syncEIPNodeFailed.Load(node.Name)
848851
}
849852

850853
if shouldSyncReroute {
@@ -862,10 +865,19 @@ func (h *defaultNetworkControllerEventHandler) AddResource(obj interface{}, from
862865
h.oc.syncEIPNodeRerouteFailed.Store(node.Name, true)
863866
return err
864867
}
868+
h.oc.syncEIPNodeRerouteFailed.Delete(node.Name)
865869
}
866-
// Add routing specific to Egress IP NOTE: GARP configuration that
867-
// Egress IP depends on is added from the gateway reconciliation logic
868-
return h.oc.eIPC.addEgressNode(node)
870+
if shouldSyncEIPNode {
871+
// Add routing specific to Egress IP NOTE: GARP configuration that
872+
// Egress IP depends on is added from the gateway reconciliation logic
873+
err := h.oc.eIPC.addEgressNode(node)
874+
if err != nil {
875+
h.oc.syncEIPNodeFailed.Store(node.Name, true)
876+
return err
877+
}
878+
h.oc.syncEIPNodeFailed.Delete(node.Name)
879+
}
880+
return nil
869881

870882
case factory.NamespaceType:
871883
ns, ok := obj.(*corev1.Namespace)
@@ -1038,24 +1050,36 @@ func (h *defaultNetworkControllerEventHandler) UpdateResource(oldObj, newObj int
10381050
h.oc.eIPC.nodeZoneState.Store(newNode.Name, h.oc.isLocalZoneNode(newNode))
10391051
h.oc.eIPC.nodeZoneState.UnlockKey(newNode.Name)
10401052

1041-
_, failed := h.oc.syncEIPNodeRerouteFailed.Load(newNode.Name)
1053+
_, syncEIPNodeRerouteFailed := h.oc.syncEIPNodeRerouteFailed.Load(newNode.Name)
10421054

10431055
// node moved from remote -> local or previously failed reroute config
1044-
if (!h.oc.isLocalZoneNode(oldNode) || failed) && h.oc.isLocalZoneNode(newNode) {
1056+
if (!h.oc.isLocalZoneNode(oldNode) || syncEIPNodeRerouteFailed) && h.oc.isLocalZoneNode(newNode) {
10451057
if err := h.oc.eIPC.ensureDefaultNoRerouteQoSRules(newNode.Name); err != nil {
10461058
return err
10471059
}
10481060
}
10491061
// update the nodeIP in the default-reRoute (102 priority) destination address-set
1050-
if failed || util.NodeHostCIDRsAnnotationChanged(oldNode, newNode) {
1062+
if syncEIPNodeRerouteFailed || util.NodeHostCIDRsAnnotationChanged(oldNode, newNode) {
10511063
klog.Infof("Egress IP detected IP address change for node %s. Updating no re-route policies", newNode.Name)
10521064
err := h.oc.eIPC.ensureDefaultNoRerouteNodePolicies()
10531065
if err != nil {
1066+
h.oc.syncEIPNodeRerouteFailed.Store(newNode.Name, true)
10541067
return err
10551068
}
1069+
h.oc.syncEIPNodeRerouteFailed.Delete(newNode.Name)
10561070
}
1057-
h.oc.syncEIPNodeRerouteFailed.Delete(newNode.Name)
1058-
return h.oc.eIPC.addEgressNode(newNode)
1071+
1072+
_, syncEIPNodeFailed := h.oc.syncEIPNodeFailed.Load(newNode.Name)
1073+
// update only if the GR join IP changed for default network
1074+
if syncEIPNodeFailed || joinCIDRChanged(oldNode, newNode, h.oc.GetNetworkName()) {
1075+
err := h.oc.eIPC.addEgressNode(newNode)
1076+
if err != nil {
1077+
h.oc.syncEIPNodeFailed.Store(newNode.Name, true)
1078+
return err
1079+
}
1080+
h.oc.syncEIPNodeFailed.Delete(newNode.Name)
1081+
}
1082+
return nil
10591083

10601084
case factory.NamespaceType:
10611085
oldNs, newNs := oldObj.(*corev1.Namespace), newObj.(*corev1.Namespace)
@@ -1118,6 +1142,7 @@ func (h *defaultNetworkControllerEventHandler) DeleteResource(obj, cachedObj int
11181142
h.oc.eIPC.nodeZoneState.Delete(node.Name)
11191143
h.oc.eIPC.nodeZoneState.UnlockKey(node.Name)
11201144
h.oc.syncEIPNodeRerouteFailed.Delete(node.Name)
1145+
h.oc.syncEIPNodeFailed.Delete(node.Name)
11211146
return nil
11221147

11231148
case factory.NamespaceType:

0 commit comments

Comments
 (0)