On Thu, Jan 25, 2024, 3:29 PM Dumitru Ceara <dce...@redhat.com> wrote:
> On 1/25/24 17:46, Numan Siddique wrote: > > On Tue, Jan 16, 2024 at 6:15 AM Dumitru Ceara <dce...@redhat.com> wrote: > >> > >> On 1/11/24 16:28, num...@ovn.org wrote: > >>> From: Numan Siddique <num...@ovn.org> > >>> > >>> It also moves the logical router port IPv6 prefix delegation > >>> updates to "sync-from-sb" engine node. > >>> > >>> With these changes, northd engine node doesn't need to do much > >>> for SB Port binding changes other than updating 'op->sb'. And > >>> there is no need to fall back to recompute. Prior to this patch > >>> northd_handle_sb_port_binding_changes() was returning false for > >>> all SB port binding updates except for the VIF PBs. This patch > >>> now handles updates to all the SB port binding by setting 'op->sb'. > >>> > >>> Signed-off-by: Numan Siddique <num...@ovn.org> > >>> --- > >> > >> Hi Numan, > >> > >> With this patch applied the "633: ovn-northd.at:10298 SB Port binding > >> incremental processing -- parallelization=yes" test occasionally fails, > >> e.g.: > >> > >> https://github.com/dceara/ovn/actions/runs/7539663594/job/20524238508 > >> > >> I saw it locally too when running the test in a loop: > >> > >> It fails with: > >> ovn-nbctl lrp-set-gateway-chassis lrp hv1 > >> ./ovn-macros.at:449: "$@" > >> northd recompute count - 2 > >> ./ovn-northd.at:10238: test x$northd_recomp = x$1 > >> ./ovn-northd.at:10238: exit code was 1, expected 0 > >> > >> Here: > >> > https://github.com/dceara/ovn/blob/e1c76b6d347570618591fe6587f6af83445223ec/tests/ovn-northd.at#L10327 > >> > >> For some reason in some cases only 2 recomputes get triggered. > > > > Thanks Dumitru and Han for the reviews. > > > > @Dumitru Ceara I've addressed all the review comments below. > > > > I think the test case is failing because of the missing "--wait=sb" in > > the ovn-nbctl commands. > > > > I don't think it's only that. It still fails even with your updated > test changes, in the same way: > > as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > ./ovn-macros.at:449: "$@" > ovn-nbctl lrp-set-gateway-chassis lrp hv1 > ./ovn-macros.at:449: "$@" > northd recompute count - 2 > ./ovn-northd.at:10238: test x$northd_recomp = x$1 > ./ovn-northd.at:10238: exit code was 1, expected 0 > > > Will the below changes in ovn-northd.at look good to you ? If so, > > and if you can provide your ack I can apply this patch. > > Otherwise I'll include it in the v6. > > > > I would prefer if we don't apply it until we figure out this test, the > CI has been relatively stable the last few weeks, I'd rather not > destabilize it if possible. > Sure. Definitely. Its passing for me locally when run in a loop. Let me dig into it further. Thanks Numan > Regards, > Dumitru > > > ---- > > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at > > index 72eb9e1173..492248b05d 100644 > > --- a/tests/ovn-northd.at > > +++ b/tests/ovn-northd.at > > @@ -10316,12 +10316,12 @@ check ovn-nbctl --wait=sb lr-add lr0 > > > > # Test normal VIF port > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-add ls0 p1 > > +check ovn-nbctl --wait=sb lsp-add ls0 p1 > > check_recompute_counter 0 0 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-set-addresses p1 "00:00:00:00:01:01 10.0.0.3" > > +check ovn-nbctl --wait=sb lsp-set-addresses p1 "00:00:00:00:01:01 > 10.0.0.3" > > check_recompute_counter 0 0 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > @@ -10329,12 +10329,13 @@ check as northd ovn-appctl -t ovn-northd > vlog/set info > > > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > check ovn-sbctl lsp-bind p1 hv1 > > +check ovn-nbctl --wait=sb sync > > check_recompute_counter 0 0 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Test lsp of type router > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-add ls0 rp -- lsp-set-type rp router > > +check ovn-nbctl --wait=sb lsp-add ls0 rp -- lsp-set-type rp router > > > > # northd engine recomputes twice. Both the times for handling NB > > logical switch port > > # changes and not because of SB port binding changes. This is > > because ovn-northd > > @@ -10344,37 +10345,37 @@ CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Set some options to 'rp'. northd should only recompute once. > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-set-options rp foo=bar > > +check ovn-nbctl --wait=sb lsp-set-options rp foo=bar > > check_recompute_counter 1 1 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Test lsp of type external > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-add ls0 e1 -- lsp-set-type e1 external > > +check ovn-nbctl --wait=sb lsp-add ls0 e1 -- lsp-set-type e1 external > > check_recompute_counter 2 2 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Set some options to 'e1'. northd should only recompute once. > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-set-options e1 foo=bar > > +check ovn-nbctl --wait=sb lsp-set-options e1 foo=bar > > check_recompute_counter 1 1 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Test lrp > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lrp-add lr0 lrp 00:00:02:01:02:03 10.0.0.1/24 > > +check ovn-nbctl --wait=sb lrp-add lr0 lrp 00:00:02:01:02:03 10.0.0.1/24 > > check_recompute_counter 1 1 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Set some options on 'lrp'. northd should only recompute once. > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lrp-set-options lrp route_table=rtb-1 > > +check ovn-nbctl --wait=sb lrp-set-options lrp route_table=rtb-1 > > check_recompute_counter 1 1 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Make lrp a gateway port > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lrp-set-gateway-chassis lrp hv1 > > +check ovn-nbctl --wait=sb lrp-set-gateway-chassis lrp hv1 > > # There will be 3 recomputes of northd engine node > > # 1. missing handler for input NB_logical_router > > # 2. missing handler for input SB_ha_chassis_group > > @@ -10384,7 +10385,7 @@ check_recompute_counter 3 3 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl clear logical_router_port lrp gateway_chassis > > +check ovn-nbctl --wait=sb clear logical_router_port lrp gateway_chassis > > # There will be 2 recomputes of northd engine node > > # 1. missing handler for input NB_logical_router > > # 2. missing handler for input SB_ha_chassis_group > > @@ -10393,17 +10394,17 @@ CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > # Delete some of the ports. > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-del p1 > > +check ovn-nbctl --wait=sb lsp-del p1 > > check_recompute_counter 0 0 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lsp-del e1 > > +check ovn-nbctl --wait=sb lsp-del e1 > > check_recompute_counter 1 1 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > -check ovn-nbctl lrp-del lrp > > +check ovn-nbctl --wait=sb lrp-del lrp > > check_recompute_counter 1 1 > > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > -------------------------------- > > > > Thanks > > Numan > > > > > > > >> > >>> northd/en-northd.c | 2 +- > >>> northd/en-sync-sb.c | 3 +- > >>> northd/northd.c | 296 ++++++++++++++++++++++++++------------------ > >>> northd/northd.h | 6 +- > >>> tests/ovn-northd.at | 158 +++++++++++++++++++++-- > >>> 5 files changed, 334 insertions(+), 131 deletions(-) > >>> > >>> diff --git a/northd/en-northd.c b/northd/en-northd.c > >>> index 28559ed211..677b2b1ab0 100644 > >>> --- a/northd/en-northd.c > >>> +++ b/northd/en-northd.c > >>> @@ -189,7 +189,7 @@ northd_sb_port_binding_handler(struct engine_node > *node, > >>> northd_get_input_data(node, &input_data); > >>> > >>> if (!northd_handle_sb_port_binding_changes( > >>> - input_data.sbrec_port_binding_table, &nd->ls_ports)) { > >>> + input_data.sbrec_port_binding_table, &nd->ls_ports, > &nd->lr_ports)) { > >>> return false; > >>> } > >>> > >>> diff --git a/northd/en-sync-sb.c b/northd/en-sync-sb.c > >>> index 3aaab8d005..45be7ddbcb 100644 > >>> --- a/northd/en-sync-sb.c > >>> +++ b/northd/en-sync-sb.c > >>> @@ -288,7 +288,8 @@ en_sync_to_sb_pb_run(struct engine_node *node, > void *data OVS_UNUSED) > >>> const struct engine_context *eng_ctx = engine_get_context(); > >>> struct northd_data *northd_data = engine_get_input_data("northd", > node); > >>> > >>> - sync_pbs(eng_ctx->ovnsb_idl_txn, &northd_data->ls_ports); > >>> + sync_pbs(eng_ctx->ovnsb_idl_txn, &northd_data->ls_ports, > >>> + &northd_data->lr_ports); > >>> engine_set_node_state(node, EN_UPDATED); > >>> } > >>> > >>> diff --git a/northd/northd.c b/northd/northd.c > >>> index f32e3bf21a..23f2dae26b 100644 > >>> --- a/northd/northd.c > >>> +++ b/northd/northd.c > >>> @@ -3435,6 +3435,9 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn > *ovnsb_txn, > >>> { > >>> sbrec_port_binding_set_datapath(op->sb, op->od->sb); > >>> if (op->nbrp) { > >>> + /* Note: SB port binding options for router ports are set in > >>> + * sync_pbs(). */ > >>> + > >>> /* If the router is for l3 gateway, it resides on a chassis > >>> * and its port type is "l3gateway". */ > >>> const char *chassis_name = smap_get(&op->od->nbr->options, > "chassis"); > >>> @@ -3446,15 +3449,11 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn > *ovnsb_txn, > >>> sbrec_port_binding_set_type(op->sb, "patch"); > >>> } > >>> > >>> - struct smap new; > >>> - smap_init(&new); > >>> if (is_cr_port(op)) { > >>> ovs_assert(sbrec_chassis_by_name); > >>> ovs_assert(sbrec_chassis_by_hostname); > >>> ovs_assert(sbrec_ha_chassis_grp_by_name); > >>> ovs_assert(active_ha_chassis_grps); > >>> - const char *redirect_type = smap_get(&op->nbrp->options, > >>> - "redirect-type"); > >>> > >>> if (op->nbrp->ha_chassis_group) { > >>> if (op->nbrp->n_gateway_chassis) { > >>> @@ -3496,49 +3495,8 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn > *ovnsb_txn, > >>> /* Delete the legacy gateway_chassis from the pb. */ > >>> sbrec_port_binding_set_gateway_chassis(op->sb, NULL, > 0); > >>> } > >>> - smap_add(&new, "distributed-port", op->nbrp->name); > >>> - > >>> - bool always_redirect = > >>> - !op->od->has_distributed_nat && > >>> - > !l3dgw_port_has_associated_vtep_lports(op->l3dgw_port); > >>> - > >>> - if (redirect_type) { > >>> - smap_add(&new, "redirect-type", redirect_type); > >>> - /* XXX Why can't we enable always-redirect when > redirect-type > >>> - * is bridged? */ > >>> - if (!strcmp(redirect_type, "bridged")) { > >>> - always_redirect = false; > >>> - } > >>> - } > >>> - > >>> - if (always_redirect) { > >>> - smap_add(&new, "always-redirect", "true"); > >>> - } > >>> - } else { > >>> - if (op->peer) { > >>> - smap_add(&new, "peer", op->peer->key); > >>> - if (op->nbrp->ha_chassis_group || > >>> - op->nbrp->n_gateway_chassis) { > >>> - char *redirect_name = > >>> - ovn_chassis_redirect_name(op->nbrp->name); > >>> - smap_add(&new, "chassis-redirect-port", > redirect_name); > >>> - free(redirect_name); > >>> - } > >>> - } > >>> - if (chassis_name) { > >>> - smap_add(&new, "l3gateway-chassis", chassis_name); > >>> - } > >>> } > >>> > >>> - const char *ipv6_pd_list = smap_get(&op->sb->options, > >>> - "ipv6_ra_pd_list"); > >>> - if (ipv6_pd_list) { > >>> - smap_add(&new, "ipv6_ra_pd_list", ipv6_pd_list); > >>> - } > >>> - > >>> - sbrec_port_binding_set_options(op->sb, &new); > >>> - smap_destroy(&new); > >>> - > >>> sbrec_port_binding_set_parent_port(op->sb, NULL); > >>> sbrec_port_binding_set_tag(op->sb, NULL, 0); > >>> > >>> @@ -4768,12 +4726,14 @@ check_sb_lb_duplicates(const struct > sbrec_load_balancer_table *table) > >>> return duplicates; > >>> } > >>> > >>> -/* Syncs the SB port binding for the ovn_port 'op'. Caller should > make sure > >>> - * that the OVN SB IDL txn is not NULL. Presently it only syncs the > nat > >>> - * column of port binding corresponding to the 'op->nbsp' */ > >>> +/* Syncs the SB port binding for the ovn_port 'op' of a logical > switch port. > >>> + * Caller should make sure that the OVN SB IDL txn is not NULL. > Presently it > >>> + * only syncs the nat column of port binding corresponding to the > 'op->nbsp' */ > >>> static void > >>> -sync_pb_for_op(struct ovn_port *op) > >>> +sync_pb_for_lsp(struct ovn_port *op) > >>> { > >>> + ovs_assert(op->nbsp); > >>> + > >>> if (lsp_is_router(op->nbsp)) { > >>> const char *chassis = NULL; > >>> if (op->peer && op->peer->od && op->peer->od->nbr) { > >>> @@ -4895,18 +4855,86 @@ sync_pb_for_op(struct ovn_port *op) > >>> } > >>> } > >>> > >>> +/* Syncs the SB port binding for the ovn_port 'op' of a logical > router port. > >>> + * Caller should make sure that the OVN SB IDL txn is not NULL. > Presently it > >>> + * only sets the port binding options column for the router ports */ > >>> +static void > >>> +sync_pb_for_lrp(struct ovn_port *op) > >>> +{ > >>> + ovs_assert(op->nbrp); > >>> + > >>> + struct smap new; > >>> + smap_init(&new); > >>> + > >>> + const char *chassis_name = smap_get(&op->od->nbr->options, > "chassis"); > >>> + if (is_cr_port(op)) { > >>> + smap_add(&new, "distributed-port", op->nbrp->name); > >>> + > >>> + bool always_redirect = > >>> + !op->od->has_distributed_nat && > >>> + !l3dgw_port_has_associated_vtep_lports(op->l3dgw_port); > >>> + > >>> + const char *redirect_type = smap_get(&op->nbrp->options, > >>> + "redirect-type"); > >>> + if (redirect_type) { > >>> + smap_add(&new, "redirect-type", redirect_type); > >>> + /* XXX Why can't we enable always-redirect when > redirect-type > >>> + * is bridged? */ > >> > >> Nit: indentation > >> > >>> + if (!strcmp(redirect_type, "bridged")) { > >>> + always_redirect = false; > >>> + } > >>> + } > >>> + > >>> + if (always_redirect) { > >>> + smap_add(&new, "always-redirect", "true"); > >>> + } > >>> + } else { > >>> + if (op->peer) { > >>> + smap_add(&new, "peer", op->peer->key); > >>> + if (op->nbrp->ha_chassis_group || > >>> + op->nbrp->n_gateway_chassis) { > >>> + char *redirect_name = > >>> + ovn_chassis_redirect_name(op->nbrp->name); > >>> + smap_add(&new, "chassis-redirect-port", > redirect_name); > >>> + free(redirect_name); > >>> + } > >>> + } > >>> + if (chassis_name) { > >>> + smap_add(&new, "l3gateway-chassis", chassis_name); > >>> + } > >>> + } > >>> + > >>> + const char *ipv6_pd_list = smap_get(&op->sb->options, > "ipv6_ra_pd_list"); > >>> + if (ipv6_pd_list) { > >>> + smap_add(&new, "ipv6_ra_pd_list", ipv6_pd_list); > >>> + } > >>> + > >>> + sbrec_port_binding_set_options(op->sb, &new); > >>> + smap_destroy(&new); > >>> +} > >>> + > >>> +static void ovn_update_ipv6_options(struct hmap *lr_ports); > >>> +static void ovn_update_ipv6_opt_for_op(struct ovn_port *op); > >>> + > >>> /* Sync the SB Port bindings which needs to be updated. > >>> * Presently it syncs the nat column of port bindings corresponding to > >>> * the logical switch ports. */ > >>> void > >>> -sync_pbs(struct ovsdb_idl_txn *ovnsb_idl_txn, struct hmap *ls_ports) > >>> +sync_pbs(struct ovsdb_idl_txn *ovnsb_idl_txn, struct hmap *ls_ports, > >>> + struct hmap *lr_ports) > >>> { > >>> ovs_assert(ovnsb_idl_txn); > >>> > >>> struct ovn_port *op; > >>> HMAP_FOR_EACH (op, key_node, ls_ports) { > >>> - sync_pb_for_op(op); > >>> + sync_pb_for_lsp(op); > >>> + } > >>> + > >>> + HMAP_FOR_EACH (op, key_node, lr_ports) { > >>> + sync_pb_for_lrp(op); > >>> } > >>> + > >>> + ovn_update_ipv6_options(lr_ports); > >>> } > >>> > >>> /* Sync the SB Port bindings for the added and updated logical switch > ports > >>> @@ -4918,12 +4946,14 @@ sync_pbs_for_northd_changed_ovn_ports( struct > tracked_ovn_ports *trk_ovn_ports) > >>> struct ovn_port *op; > >>> HMAPX_FOR_EACH (hmapx_node, &trk_ovn_ports->created) { > >>> op = hmapx_node->data; > >>> - sync_pb_for_op(op); > >>> + ovs_assert(op->nbsp); > >> > >> This is already checked inside sync_pb_for_lsp(). Let's remove it from > >> here. Then what I mentioned in patch 01/16 still applies, we don't need > >> the local 'op' variable anymore. > >> > >>> + sync_pb_for_lsp(op); > >>> } > >>> > >>> HMAPX_FOR_EACH (hmapx_node, &trk_ovn_ports->updated) { > >>> op = hmapx_node->data; > >>> - sync_pb_for_op(op); > >>> + ovs_assert(op->nbsp); > >>> + sync_pb_for_lsp(op); > >> > >> Same here. > >> > >>> } > >>> > >>> return true; > >>> @@ -5671,20 +5701,31 @@ fail: > >>> bool > >>> northd_handle_sb_port_binding_changes( > >>> const struct sbrec_port_binding_table *sbrec_port_binding_table, > >>> - struct hmap *ls_ports) > >>> + struct hmap *ls_ports, struct hmap *lr_ports) > >>> { > >>> const struct sbrec_port_binding *pb; > >>> static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > >>> SBREC_PORT_BINDING_TABLE_FOR_EACH_TRACKED (pb, > sbrec_port_binding_table) { > >>> - /* Return false if the 'pb' belongs to a router port. We > don't handle > >>> - * I-P for router ports yet. */ > >>> - if (is_pb_router_type(pb)) { > >>> - return false; > >>> + bool is_router_port = is_pb_router_type(pb); > >>> + struct ovn_port *op = NULL; > >>> + > >>> + if (is_router_port) { > >>> + /* A router port binding 'pb' can belong to > >>> + * - a logical switch port of type router or > >>> + * - a logical router port. > >>> + * > >>> + * So, first search in lr_ports hmap. If not found, > search in > >>> + * ls_ports hmap. > >>> + * */ > >>> + op = ovn_port_find(lr_ports, pb->logical_port); > >>> } > >>> > >>> - struct ovn_port *op = ovn_port_find(ls_ports, > pb->logical_port); > >>> - if (op && !op->lsp_can_be_inc_processed) { > >>> - return false; > >>> + if (!op) { > >>> + op = ovn_port_find(ls_ports, pb->logical_port); > >>> + > >>> + if (op) { > >>> + is_router_port = false; > >>> + } > >>> } > >>> > >>> if (sbrec_port_binding_is_new(pb)) { > >>> @@ -5693,7 +5734,8 @@ northd_handle_sb_port_binding_changes( > >>> * pointer in northd data. Fallback to recompute > otherwise. */ > >>> if (!op) { > >>> VLOG_WARN_RL(&rl, "A port-binding for %s is created > but the " > >>> - "LSP is not found.", pb->logical_port); > >>> + "%s is not found.", pb->logical_port, > >>> + is_router_port ? "LRP" : "LSP"); > >>> return false; > >>> } > >>> op->sb = pb; > >>> @@ -5703,18 +5745,29 @@ northd_handle_sb_port_binding_changes( > >>> * case. Fallback to recompute otherwise, to avoid > dangling > >>> * sb idl pointers and other unexpected behavior. */ > >>> if (op && op->sb == pb) { > >>> - VLOG_WARN_RL(&rl, "A port-binding for %s is deleted > but " > >>> - "the LSP still exists.", > pb->logical_port); > >>> + VLOG_WARN_RL(&rl, "A port-binding for %s is deleted > but the " > >>> + "LSP/LRP still exists.", > pb->logical_port); > >>> return false; > >>> } > >>> } else { > >>> - /* The PB is updated, most likely because of > binding/unbinding > >>> - * to/from a chassis, and we can ignore the change > (updating NB > >>> - * "up" will be handled in the engine node > "sync_from_sb"). > >>> + /* The PB is updated. > >>> + * For an LSP PB it is most likely because of > >>> + * binding/unbinding to/from a chassis, and we can ignore > the > >>> + * change (updating NB "up" will be handled in the engine > node > >>> + * "sync_from_sb"). > >>> + * > >>> + * For an LRP PB, it is most likely because of > >>> + * - IPv6 prefix delagation updates from ovn-controller. > >>> + * This update is handled in "sync_from_sb" node. > >>> + * - ha chassis group and this can be ignored. > >>> + * > >>> + * All other changes can be ignored. > >>> + * > >>> * Fallback to recompute for anything unexpected. */ > >>> if (!op) { > >>> VLOG_WARN_RL(&rl, "A port-binding for %s is updated > but the " > >>> - "LSP is not found.", pb->logical_port); > >>> + "%s is not found.", pb->logical_port, > >>> + is_router_port ? "LRP" : "LSP"); > >>> return false; > >>> } > >>> if (op->sb != pb) { > >>> @@ -7855,67 +7908,70 @@ static void > >>> copy_ra_to_sb(struct ovn_port *op, const char *address_mode); > >>> > >>> static void > >>> -ovn_update_ipv6_options(struct hmap *lr_ports) > >>> +ovn_update_ipv6_opt_for_op(struct ovn_port *op) > >>> { > >>> - struct ovn_port *op; > >>> - HMAP_FOR_EACH (op, key_node, lr_ports) { > >>> - ovs_assert(op->nbrp); > >>> - > >>> - if (op->nbrp->peer || !op->peer) { > >>> - continue; > >>> - } > >>> + if (op->nbrp->peer || !op->peer) { > >>> + return; > >>> + } > >>> > >>> - if (!op->lrp_networks.n_ipv6_addrs) { > >>> - continue; > >>> - } > >>> + if (!op->lrp_networks.n_ipv6_addrs) { > >>> + return; > >>> + } > >>> > >>> - struct smap options; > >>> - smap_clone(&options, &op->sb->options); > >>> + struct smap options; > >>> + smap_clone(&options, &op->sb->options); > >>> > >>> - /* enable IPv6 prefix delegation */ > >>> - bool prefix_delegation = smap_get_bool(&op->nbrp->options, > >>> + /* enable IPv6 prefix delegation */ > >>> + bool prefix_delegation = smap_get_bool(&op->nbrp->options, > >>> "prefix_delegation", > false); > >>> - if (!lrport_is_enabled(op->nbrp)) { > >>> - prefix_delegation = false; > >>> - } > >>> - if (smap_get_bool(&options, "ipv6_prefix_delegation", > >>> - false) != prefix_delegation) { > >>> - smap_add(&options, "ipv6_prefix_delegation", > >>> - prefix_delegation ? "true" : "false"); > >>> - } > >>> + if (!lrport_is_enabled(op->nbrp)) { > >>> + prefix_delegation = false; > >>> + } > >>> + if (smap_get_bool(&options, "ipv6_prefix_delegation", > >>> + false) != prefix_delegation) { > >>> + smap_add(&options, "ipv6_prefix_delegation", > >>> + prefix_delegation ? "true" : "false"); > >>> + } > >>> > >>> - bool ipv6_prefix = smap_get_bool(&op->nbrp->options, > >>> + bool ipv6_prefix = smap_get_bool(&op->nbrp->options, > >>> "prefix", false); > >> > >> Nit: this fits on a single line now. > >> > >>> - if (!lrport_is_enabled(op->nbrp)) { > >>> - ipv6_prefix = false; > >>> - } > >>> - if (smap_get_bool(&options, "ipv6_prefix", false) != > ipv6_prefix) { > >>> - smap_add(&options, "ipv6_prefix", > >>> - ipv6_prefix ? "true" : "false"); > >>> - } > >>> - sbrec_port_binding_set_options(op->sb, &options); > >>> + if (!lrport_is_enabled(op->nbrp)) { > >>> + ipv6_prefix = false; > >>> + } > >>> + if (smap_get_bool(&options, "ipv6_prefix", false) != ipv6_prefix) > { > >>> + smap_add(&options, "ipv6_prefix", ipv6_prefix ? "true" : > "false"); > >>> + } > >>> + sbrec_port_binding_set_options(op->sb, &options); > >>> > >>> - smap_destroy(&options); > >>> + smap_destroy(&options); > >>> > >>> - const char *address_mode = smap_get( > >>> - &op->nbrp->ipv6_ra_configs, "address_mode"); > >>> + const char *address_mode = smap_get(&op->nbrp->ipv6_ra_configs, > >>> + "address_mode"); > >>> > >>> - if (!address_mode) { > >>> - continue; > >>> - } > >>> - if (strcmp(address_mode, "slaac") && > >>> - strcmp(address_mode, "dhcpv6_stateful") && > >>> - strcmp(address_mode, "dhcpv6_stateless")) { > >>> - static struct vlog_rate_limit rl = > VLOG_RATE_LIMIT_INIT(1, 5); > >>> - VLOG_WARN_RL(&rl, "Invalid address mode [%s] defined", > >>> - address_mode); > >>> - continue; > >>> - } > >>> + if (!address_mode) { > >>> + return; > >>> + } > >>> + if (strcmp(address_mode, "slaac") && > >>> + strcmp(address_mode, "dhcpv6_stateful") && > >>> + strcmp(address_mode, "dhcpv6_stateless")) { > >>> + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > >>> + VLOG_WARN_RL(&rl, "Invalid address mode [%s] defined", > >>> + address_mode); > >>> + return; > >>> + } > >>> > >>> - if (smap_get_bool(&op->nbrp->ipv6_ra_configs, "send_periodic", > >>> - false)) { > >>> - copy_ra_to_sb(op, address_mode); > >>> - } > >>> + if (smap_get_bool(&op->nbrp->ipv6_ra_configs, "send_periodic", > false)) { > >>> + copy_ra_to_sb(op, address_mode); > >>> + } > >>> +} > >>> + > >>> +static void > >>> +ovn_update_ipv6_options(struct hmap *lr_ports) > >>> +{ > >>> + struct ovn_port *op; > >>> + HMAP_FOR_EACH (op, key_node, lr_ports) { > >>> + ovs_assert(op->nbrp); > >> > >> I would move this assert inside ovn_update_ipv6_opt_for_op() just in > >> case we ever want to call it in multiple places in the future. > >> > >>> + ovn_update_ipv6_opt_for_op(op); > >>> } > >>> } > >>> > >>> @@ -18007,8 +18063,6 @@ ovnnb_db_run(struct northd_input *input_data, > >>> &data->lr_ports); > >>> stopwatch_stop(BUILD_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); > >>> stopwatch_start(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); > >>> - ovn_update_ipv6_options(&data->lr_ports); > >>> - ovn_update_ipv6_prefix(&data->lr_ports); > >>> > >>> sync_mirrors(ovnsb_txn, input_data->nbrec_mirror_table, > >>> input_data->sbrec_mirror_table); > >>> @@ -18339,6 +18393,8 @@ ovnsb_db_run(struct ovsdb_idl_txn *ovnnb_txn, > >>> &ha_ref_chassis_map); > >>> } > >>> shash_destroy(&ha_ref_chassis_map); > >>> + > >>> + ovn_update_ipv6_prefix(lr_ports); > >>> } > >>> > >>> const char * > >>> diff --git a/northd/northd.h b/northd/northd.h > >>> index 23521065e8..233dca8084 100644 > >>> --- a/northd/northd.h > >>> +++ b/northd/northd.h > >>> @@ -364,7 +364,8 @@ bool lflow_handle_northd_port_changes(struct > ovsdb_idl_txn *ovnsb_txn, > >>> struct lflow_input *, > >>> struct hmap *lflows); > >>> bool northd_handle_sb_port_binding_changes( > >>> - const struct sbrec_port_binding_table *, struct hmap *ls_ports); > >>> + const struct sbrec_port_binding_table *, struct hmap *ls_ports, > >>> + struct hmap *lr_ports); > >>> > >>> struct tracked_lb_data; > >>> bool northd_handle_lb_data_changes(struct tracked_lb_data *, > >>> @@ -394,7 +395,8 @@ void sync_lbs(struct ovsdb_idl_txn *, const struct > sbrec_load_balancer_table *, > >>> struct chassis_features *chassis_features); > >>> bool check_sb_lb_duplicates(const struct sbrec_load_balancer_table *); > >>> > >>> -void sync_pbs(struct ovsdb_idl_txn *, struct hmap *ls_ports); > >>> +void sync_pbs(struct ovsdb_idl_txn *, struct hmap *ls_ports, > >>> + struct hmap *lr_ports); > >>> bool sync_pbs_for_northd_changed_ovn_ports( struct tracked_ovn_ports > *); > >>> > >>> static inline bool > >>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at > >>> index 4a02dacf60..4edad24e53 100644 > >>> --- a/tests/ovn-northd.at > >>> +++ b/tests/ovn-northd.at > >>> @@ -10073,7 +10073,7 @@ check ovn-nbctl --wait=hv lsp-add ls0 lsp0-0 > -- lsp-set-addresses lsp0-0 "unknow > >>> ovs-vsctl add-port br-int lsp0-0 -- set interface lsp0-0 > external_ids:iface-id=lsp0-0 > >>> wait_for_ports_up > >>> check ovn-nbctl --wait=hv sync > >>> -check_recompute_counter 4 5 5 5 5 5 > >>> +check_recompute_counter 3 4 3 4 3 4 > >>> > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> 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" > >>> @@ -10235,6 +10235,126 @@ OVN_CLEANUP([hv1]) > >>> AT_CLEANUP > >>> ]) > >>> > >>> +OVN_FOR_EACH_NORTHD_NO_HV([ > >>> +AT_SETUP([SB Port binding incremental processing]) > >>> +ovn_start > >>> + > >>> +check_recompute_counter() { > >>> + northd_recomp=$(as northd ovn-appctl -t ovn-northd > inc-engine/show-stats northd recompute) > >>> + echo "northd recompute count - $northd_recomp" > >>> + AT_CHECK([test x$northd_recomp = x$1]) > >>> + > >>> + lflow_recomp=$(as northd ovn-appctl -t ovn-northd > inc-engine/show-stats lflow recompute) > >>> + echo "lflow recompute count - $lflow_recomp" > >>> + AT_CHECK([test x$lflow_recomp = x$2]) > >>> +} > >>> + > >>> +net_add n1 > >>> +sim_add hv1 > >>> +as hv1 > >>> +ovs-vsctl add-br br-phys > >>> +ovn_attach n1 br-phys 192.168.0.11 > >>> + > >>> +check ovn-nbctl --wait=sb ls-add ls0 > >>> +check ovn-nbctl --wait=sb lr-add lr0 > >>> + > >>> +# Test normal VIF port > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-add ls0 p1 > >>> +check_recompute_counter 0 0 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-set-addresses p1 "00:00:00:00:01:01 10.0.0.3" > >>> +check_recompute_counter 0 0 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +check as northd ovn-appctl -t ovn-northd vlog/set info > >>> + > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-sbctl lsp-bind p1 hv1 > >>> +check_recompute_counter 0 0 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Test lsp of type router > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-add ls0 rp -- lsp-set-type rp router > >>> + > >>> +# northd engine recomputes twice. Both the times for handling NB > logical switch port > >>> +# changes and not because of SB port binding changes. This is > because ovn-northd > >>> +# sets the "up" to true. > >>> +check_recompute_counter 2 2 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Set some options to 'rp'. northd should only recompute once. > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-set-options rp foo=bar > >>> +check_recompute_counter 1 1 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Test lsp of type external > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-add ls0 e1 -- lsp-set-type e1 external > >>> +check_recompute_counter 2 2 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Set some options to 'e1'. northd should only recompute once. > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-set-options e1 foo=bar > >>> +check_recompute_counter 1 1 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Test lrp > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lrp-add lr0 lrp 00:00:02:01:02:03 10.0.0.1/24 > >>> +check_recompute_counter 1 1 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Set some options on 'lrp'. northd should only recompute once. > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lrp-set-options lrp route_table=rtb-1 > >>> +check_recompute_counter 1 1 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Make lrp a gateway port > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lrp-set-gateway-chassis lrp hv1 > >>> +# There will be 3 recomputes of northd engine node > >>> +# 1. missing handler for input NB_logical_router > >>> +# 2. missing handler for input SB_ha_chassis_group > >>> +# 3. missing handler for input NB_logical_router when ovn-northd > >>> +# updates the hosting-chassis option in NB_logical_router_port. > >>> +check_recompute_counter 3 3 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl clear logical_router_port lrp gateway_chassis > >>> +# There will be 2 recomputes of northd engine node > >>> +# 1. missing handler for input NB_logical_router > >>> +# 2. missing handler for input SB_ha_chassis_group > >>> +check_recompute_counter 2 2 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +# Delete some of the ports. > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-del p1 > >>> +check_recompute_counter 0 0 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lsp-del e1 > >>> +check_recompute_counter 1 1 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> +check ovn-nbctl lrp-del lrp > >>> +check_recompute_counter 1 1 > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> + > >>> +OVN_CLEANUP([hv1]) > >>> +AT_CLEANUP > >>> +]) > >>> + > >>> OVN_FOR_EACH_NORTHD_NO_HV([ > >>> AT_SETUP([ACL/Meter incremental processing - no northd recompute]) > >>> ovn_start > >>> @@ -10269,6 +10389,7 @@ CHECK_NO_CHANGE_AFTER_RECOMPUTE(1) > >>> AT_CLEANUP > >>> ]) > >>> > >>> + > >>> OVN_FOR_EACH_NORTHD_NO_HV([ > >>> AT_SETUP([check fip and lb flows]) > >>> AT_KEYWORDS([fip-lb-flows]) > >>> @@ -10471,7 +10592,7 @@ ovn-nbctl lsp-set-addresses sw0-lr0 > 00:00:00:00:ff:01 > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> ovn-nbctl --wait=sb lsp-set-options sw0-lr0 router-port=lr0-sw0 > >>> check_engine_stats lb_data norecompute compute > >>> -check_engine_stats northd recompute nocompute > >>> +check_engine_stats northd recompute compute > >>> check_engine_stats lflow recompute nocompute > >>> check_engine_stats sync_to_sb_lb recompute nocompute > >>> > >>> @@ -11114,12 +11235,14 @@ ovn_attach n1 br-phys 192.168.0.11 > >>> ovn-sbctl chassis-add gw1 geneve 127.0.0.1 > >>> > >>> check ovn-nbctl ls-add sw0 > >>> -check ovn-nbctl lsp-add sw0 sw0p1 -- lsp-set-addresses sw0p1 > "00:00:20:20:12:01 10.0.0.4" > >>> +check ovn-nbctl --wait=sb lsp-add sw0 sw0p1 -- lsp-set-addresses > sw0p1 "00:00:20:20:12:01 10.0.0.4" > >>> > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-add lr0 > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Adding a logical router port should result in recompute > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> @@ -11127,16 +11250,20 @@ check ovn-nbctl lrp-add lr0 lr0-sw0 > 00:00:00:00:ff:01 10.0.0.1/24 > >>> # for northd engine there will be both recompute and compute > >>> # first it will be recompute to handle lr0-sw0 and then a compute > >>> # for the SB port binding change. > >>> -check_engine_stats northd recompute nocompute > >>> +check_engine_stats northd recompute compute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> ovn-nbctl lsp-add sw0 sw0-lr0 > >>> ovn-nbctl lsp-set-type sw0-lr0 router > >>> ovn-nbctl lsp-set-addresses sw0-lr0 00:00:00:00:ff:01 > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lsp-set-options sw0-lr0 router-port=lr0-sw0 > >>> -check_engine_stats northd recompute nocompute > >>> +check_engine_stats northd recompute compute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> ovn-nbctl ls-add public > >>> ovn-nbctl lrp-add lr0 lr0-public 00:00:20:20:12:13 172.168.0.100/24 > >>> @@ -11158,7 +11285,9 @@ ovn-nbctl --wait=hv lrp-set-gateway-chassis > lr0-public hv1 20 > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl set logical_router_port lr0-sw0 options:foo=bar > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Do checks for NATs. > >>> # Add a NAT. This should not result in recompute of both northd and > lflow > >>> @@ -11167,6 +11296,7 @@ check as northd ovn-appctl -t ovn-northd > inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-nat-add lr0 dnat_and_snat 172.168.0.110 > 10.0.0.4 > >>> check_engine_stats northd recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Update the NAT options column > >>> @@ -11174,6 +11304,7 @@ check as northd ovn-appctl -t ovn-northd > inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb set NAT . options:foo=bar > >>> check_engine_stats northd recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Update the NAT external_ip column > >>> @@ -11181,6 +11312,7 @@ check as northd ovn-appctl -t ovn-northd > inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb set NAT . external_ip=172.168.0.120 > >>> check_engine_stats northd recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Update the NAT logical_ip column > >>> @@ -11188,6 +11320,7 @@ check as northd ovn-appctl -t ovn-northd > inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb set NAT . logical_ip=10.0.0.10 > >>> check_engine_stats northd recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Update the NAT type > >>> @@ -11195,13 +11328,15 @@ check as northd ovn-appctl -t ovn-northd > inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb set NAT . type=snat > >>> check_engine_stats northd recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Create a dnat_and_snat NAT with external_mac and logical_port > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-nat-add lr0 dnat_and_snat 172.168.0.110 > 10.0.0.4 sw0p1 30:54:00:00:00:03 > >>> -check_engine_stats northd recompute nocompute > >>> +check_engine_stats northd recompute compute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> nat2_uuid=$(ovn-nbctl --bare --columns _uuid find nat > logical_ip=10.0.0.4) > >>> @@ -11210,6 +11345,7 @@ check as northd ovn-appctl -t ovn-northd > inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb set NAT $nat2_uuid > external_mac='"30:54:00:00:00:04"' > >>> check_engine_stats northd recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Create a load balancer and add the lb vip as NAT > >>> @@ -11223,31 +11359,35 @@ check ovn-nbctl lr-lb-add lr0 lb2 > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-nat-add lr0 dnat_and_snat 172.168.0.140 > 10.0.0.20 > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-nat-add lr0 dnat_and_snat 172.168.0.150 > 10.0.0.41 > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-nat-del lr0 dnat_and_snat 172.168.0.150 > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-nat-del lr0 dnat_and_snat 172.168.0.140 > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> # Delete the NAT > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb clear logical_router lr0 nat > >>> -check_engine_stats northd recompute nocompute > >>> +check_engine_stats northd recompute compute > >>> check_engine_stats lflow recompute nocompute > >>> check_engine_stats sync_to_sb_pb recompute nocompute > >>> CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> @@ -11256,12 +11396,16 @@ CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-policy-add lr0 10 "ip4.src == 10.0.0.3" > reroute 172.168.0.101,172.168.0.102 > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > >>> check ovn-nbctl --wait=sb lr-policy-del lr0 10 "ip4.src == 10.0.0.3" > >>> check_engine_stats northd recompute nocompute > >>> +check_engine_stats sync_to_sb_pb recompute nocompute > >>> check_engine_stats lflow recompute nocompute > >>> +CHECK_NO_CHANGE_AFTER_RECOMPUTE > >>> > >>> OVN_CLEANUP([hv1]) > >>> AT_CLEANUP > >> > >> The rest looks good to me but I'd prefer we figure out the test failure > >> before acking the patch. > >> > >> Regards, > >> Dumitru > >> > >> > >> _______________________________________________ > >> dev mailing list > >> d...@openvswitch.org > >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev > >> > > > > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev