On Tue, Aug 8, 2023 at 1:15 PM Han Zhou <[email protected]> wrote:
>
> On Thu, Aug 3, 2023 at 12:29 PM <[email protected]> wrote:
> >
> > From: Numan Siddique <[email protected]>
> >
> > 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 <[email protected]>

Thanks.  I addressed your comments and applied the patch to the main branch.

I added a separate test case as you suggested.

Numan

>
> > Fixes: b337750e45be ("northd: Incremental processing of VIF changes in
> 'northd' node.")
> > CC: Han Zhou <[email protected]>
> > Signed-off-by: Numan Siddique <[email protected]>
> > ---
> >  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
> [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