Thanks Ales, it looks good to me.

Acked-by: Mark Michelson <[email protected]>

On Thu, Nov 20, 2025 at 6:41 AM Ales Musil via dev
<[email protected]> wrote:
>
> Make sure we synchronize the logical flows for incrementally
> processed LRs only after all the logical flows were created.
> This should ensure that we don't process datapath groups multiple
> times during the sync. This significantly shortens the time needed
> to process multiple LRs at the same time.
>
> Fixes: 9ec96d0d85b6 ("northd: Add and delete logical routers in en-lflow 
> engine node.")
> Reported-at: https://issues.redhat.com/browse/FDP-2682
> Signed-off-by: Ales Musil <[email protected]>
> ---
>  northd/northd.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/northd/northd.c b/northd/northd.c
> index e978b66c2..011f449ec 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -19301,8 +19301,7 @@ lflow_handle_northd_lr_changes(struct ovsdb_idl_txn 
> *ovnsb_txn,
>      struct hmapx_node *hmapx_node;
>      HMAPX_FOR_EACH (hmapx_node, &tracked_lrs->deleted) {
>          struct ovn_datapath *od = hmapx_node->data;
> -        lflow_ref_unlink_lflows(od->datapath_lflows);
> -        handled = lflow_ref_sync_lflows(
> +        handled = lflow_ref_resync_flows(
>              od->datapath_lflows, lflows, ovnsb_txn, 
> lflow_input->ls_datapaths,
>              lflow_input->lr_datapaths,
>              lflow_input->ovn_internal_version_changed,
> @@ -19325,17 +19324,28 @@ lflow_handle_northd_lr_changes(struct ovsdb_idl_txn 
> *ovnsb_txn,
>      };
>      HMAPX_FOR_EACH (hmapx_node, &tracked_lrs->crupdated) {
>          struct ovn_datapath *od = hmapx_node->data;
> +
> +        lflow_ref_unlink_lflows(od->datapath_lflows);
>          build_lswitch_and_lrouter_iterate_by_lr(od, &lsi);
> +    }
> +
> +    /* We need to make sure that all datapath groups are allocated before
> +     * trying to sync logical flows. Otherwise, we would need to recompute
> +     * those datapath groups within those flows over and over again. */
> +    HMAPX_FOR_EACH (hmapx_node, &tracked_lrs->crupdated) {
> +        struct ovn_datapath *od = hmapx_node->data;
> +
>          handled = lflow_ref_sync_lflows(
>              od->datapath_lflows, lflows, ovnsb_txn, 
> lflow_input->ls_datapaths,
>              lflow_input->lr_datapaths,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> -         if (!handled) {
> +        if (!handled) {
>              break;
> -         }
> +        }
>      }
> +
>      ds_destroy(&lsi.actions);
>      ds_destroy(&lsi.match);
>      return handled;
> --
> 2.51.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>

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

Reply via email to