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
