The garp_rarp node was doing recompute on datapaths that are not
local, this is problematic with ovn-monitor-all enabled as the
whole cluster gets notifications about unrelated port bindings.
This could lead to the node being cancelled on large scale
deployments as there is chance that SB might be readonly when
the port binding recompute is triggered.

To avoid that skip datapaths that are not local. This should prevent
an issue when the port is remote and becomes local as there are
only 2 conditions when that could happen, the datapath is already
local in that case it will be processed by the port binding handler.
In the second case the datapath is remote and becomes local when
the port is bound to local chassis, in that case we care about the
localnet.

It follows the same semantics in the opposite case local->remote,
with one exception, currently we are not removing datapath that
is local during incremental processing.

Fixes: 05527bd6ccdb ("controller: Extract garp_rarp to engine node.")
Reported-by: Ilya Maximets <i.maxim...@ovn.org>
Tested-by: Ilya Maximets <i.maxim...@ovn.org>
Signed-off-by: Ales Musil <amu...@redhat.com>
---
 controller/ovn-controller.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 1365f3e65..44398812b 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -5545,7 +5545,11 @@ garp_rarp_sb_port_binding_handler(struct engine_node 
*node,
         struct local_datapath *ld = get_local_datapath(
             &rt_data->local_datapaths, pb->datapath->tunnel_key);
 
-        if (!ld || ld->localnet_port) {
+        if (!ld) {
+            continue;
+        }
+
+        if (ld->localnet_port) {
             /* XXX: actually handle this incrementally. */
             return EN_UNHANDLED;
         }
@@ -5598,7 +5602,11 @@ garp_rarp_runtime_data_handler(struct engine_node *node, 
void *data OVS_UNUSED)
         struct local_datapath *ld = get_local_datapath(
             &rt_data->local_datapaths, tdp->dp->tunnel_key);
 
-        if (!ld || ld->localnet_port) {
+        if (!ld) {
+            continue;
+        }
+
+        if (ld->localnet_port) {
             /* XXX: actually handle this incrementally. */
             return EN_UNHANDLED;
         }
-- 
2.49.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to