On Thu, Aug 3, 2023 at 12:29 PM <num...@ovn.org> wrote:
>
> From: Numan Siddique <num...@ovn.org>
>
> When a logical switch has only router ports and if a new VIF port is
> added, both northd engine and lflow engine handle this change
> incrementally, but it misses out on adding a few logical flows
> where we have checks like :
>    if (od->n_router_ports != od->nbs->n_ports) {
>         ds_put_format(&actions, "clone {outport = %s; output; }; "
>                                 "outport = \""MC_FLOOD_L2"\"; output;",
>                       patch_op->json_key);
>         ....
>    } else {
>        ds_put_format(&actions, "outport = %s; output;",
patch_op->json_key);
>    }
>
> The same issue is seen when a VIF port is deleted and after which the
> logical switch has only router ports.
>
> This patch fixes this issue by falling back to full recompute of northd
> engine node.  It is possible to handle these changes incrementally
> in northd engine node but fall back to full recompute in lflow engine
> node.  But this patch goes for a simpler fix.  This can be optimized
> later if required.
>

Good catch! This reminds me about a ddlog performance problem for this
scenario:
https://mail.openvswitch.org/pipermail/ovs-dev/2021-September/388184.html
+1 for the quick fix. Thanks a lot for identifying such corner cases.
I'd like to work on I-P for such a scenario because it may be quite common
in environments like ovn-k8s when the first LSP is added to a LS or the
last LSP is deleted from it.
Please also find some minor comments below.

With those addressed:
Acked-by: Han Zhou <hz...@ovn.org>

> Fixes: b337750e45be ("northd: Incremental processing of VIF changes in
'northd' node.")
> CC: Han Zhou <hz...@ovn.org>
> Signed-off-by: Numan Siddique <num...@ovn.org>
> ---
>  northd/northd.c     | 10 ++++++++++
>  tests/ovn-northd.at | 28 ++++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+)
>
> diff --git a/northd/northd.c b/northd/northd.c
> index b9605862e..462fa83ca 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -5120,6 +5120,11 @@ northd_handle_ls_changes(struct ovsdb_idl_txn
*ovnsb_idl_txn,
>              op->visited = false;
>          }
>
> +        bool only_rports = (od->n_router_ports ==
hmap_count(&od->ports));
> +        if (only_rports) {
> +            goto fail;
> +        }

Would be better to also check if the n_router_ports == 0 then no need to
fallback to recompute.
Would be better to add a comment here to explain why we are doing this
check.

> +
>          /* Compare the individual ports in the old and new Logical
Switches */
>          for (size_t j = 0; j < changed_ls->n_ports; ++j) {
>              struct nbrec_logical_switch_port *new_nbsp =
changed_ls->ports[j];
> @@ -5201,6 +5206,11 @@ northd_handle_ls_changes(struct ovsdb_idl_txn
*ovnsb_idl_txn,
>              }
>          }
>
> +        only_rports = (od->n_router_ports == hmap_count(&od->ports));
> +        if (only_rports) {
> +            goto fail_clean_deleted;
> +        }

Same as above. (comments may be different, because we are checking if the
last LSP was just got deleted)

> +
>          if (!ovs_list_is_empty(&ls_change->added_ports) ||
>              !ovs_list_is_empty(&ls_change->updated_ports) ||
>              !ovs_list_is_empty(&ls_change->deleted_ports)) {
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index 3e06f14c9..912aa5431 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -9589,6 +9589,34 @@ check_recompute_counter 0 0
>
>  CHECK_NO_CHANGE_AFTER_RECOMPUTE
>

nit: Better to add a comment to describe the purpose of the tests below
because they are quite different from the above basic tests. (or even
better if just move to a separate test case)

> +check ovn-nbctl --wait=hv ls-del ls0
> +check ovn-nbctl ls-add ls0
> +check ovn-nbctl --wait=sb lr-add lr0
> +ovn-nbctl lrp-add lr0 lr0-ls0 00:00:00:00:ff:01 192.168.0.1/24
> +ovn-nbctl lsp-add ls0 ls0-lr0
> +ovn-nbctl lsp-set-type ls0-lr0 router
> +ovn-nbctl lsp-set-addresses ls0-lr0 router
> +check ovn-nbctl --wait=sb lsp-set-options ls0-lr0 router-port=lr0-ls0
> +
> +CHECK_NO_CHANGE_AFTER_RECOMPUTE
> +
> +ovn-nbctl lb-add lb0 192.168.0.10:80 10.0.0.10:8080
> +check ovn-nbctl --wait=sb ls-lb-add ls0 lb0
> +CHECK_NO_CHANGE_AFTER_RECOMPUTE
> +
> +check as northd ovn-appctl -t NORTHD_TYPE inc-engine/clear-stats
> +# Add a lsp.  northd and lflow engine should recompute since this is
> +# the first lsp added after the router ports.
> +check ovn-nbctl --wait=hv lsp-add ls0 lsp0-1 -- lsp-set-addresses lsp0-1
"aa:aa:aa:00:00:01 192.168.0.11"
> +check_recompute_counter 1 1
> +CHECK_NO_CHANGE_AFTER_RECOMPUTE

nit: after asserting that the recompute is performed (the coutner 1 1),
there is no need to CHECK_NO_CHANGE_AFTER_RECOMPUTE.

> +
> +# Delete the lsp.  northd and lflow engine should recompute.
> +check as northd ovn-appctl -t NORTHD_TYPE inc-engine/clear-stats
> +check ovn-nbctl lsp-del lsp0-1
> +check_recompute_counter 1 1
> +CHECK_NO_CHANGE_AFTER_RECOMPUTE
> +
>  OVN_CLEANUP([hv1])
>  AT_CLEANUP
>  ])
> --
> 2.40.1
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to