Multichassis reprocessing could increase the time for processing
the removal of ports. The issue is we could actually process
multiple ports over and over if there did belong into single
datapath. To prevent that create set of ports that were already
reprocessed for the multichassis in the current I-P run and do
not reprocess them again. This greatly reduces the amount of
precessing during removal as shown below with the test that
removes 1000 ports in a single transaction.

Without:
physical_flow_output, handler for input runtime_data took 992ms

With:
physical_flow_output, handler for input runtime_data took 58ms

Reported-at: https://issues.redhat.com/browse/FDP-1012
Signed-off-by: Ales Musil <[email protected]>
---
 controller/ovn-controller.c | 2 ++
 controller/physical.c       | 5 +++++
 controller/physical.h       | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 157def2a3..bce8dd1cd 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -4447,6 +4447,7 @@ static void init_physical_ctx(struct engine_node *node,
     p_ctx->if_mgr = ctrl_ctx->if_mgr;
 
     pflow_output_get_debug(node, &p_ctx->debug);
+    sset_init(&p_ctx->reprocessed_pbs);
 }
 
 static void
@@ -4456,6 +4457,7 @@ destroy_physical_ctx(struct physical_ctx *p_ctx)
         free((char *)(p_ctx->encap_ips[i]));
     }
     free(p_ctx->encap_ips);
+    sset_destroy(&p_ctx->reprocessed_pbs);
 }
 
 static void *
diff --git a/controller/physical.c b/controller/physical.c
index 3ca4e0783..d527de668 100644
--- a/controller/physical.c
+++ b/controller/physical.c
@@ -2436,6 +2436,11 @@ physical_multichassis_reprocess(const struct 
sbrec_port_binding *pb,
     const struct sbrec_port_binding *port;
     SBREC_PORT_BINDING_FOR_EACH_EQUAL (port, target,
                                        p_ctx->sbrec_port_binding_by_datapath) {
+        /* Ignore PBs that were already reprocessed. */
+        if (!sset_add(&p_ctx->reprocessed_pbs, port->logical_port)) {
+            continue;
+        }
+
         ofctrl_remove_flows(flow_table, &port->header_.uuid);
         physical_eval_port_binding(p_ctx, port, flow_table);
     }
diff --git a/controller/physical.h b/controller/physical.h
index f0aecc852..b0f07fc55 100644
--- a/controller/physical.h
+++ b/controller/physical.h
@@ -70,6 +70,9 @@ struct physical_ctx {
     const char **encap_ips;
     struct physical_debug debug;
     bool always_tunnel;
+    /* Set of port binding names that have been already reprocessed during
+     * the I-P run. */
+    struct sset reprocessed_pbs;
 };
 
 void physical_register_ovs_idl(struct ovsdb_idl *);
-- 
2.47.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to