On Thu, Jan 11, 2024 at 7:33 AM <num...@ovn.org> wrote: > > From: Numan Siddique <num...@ovn.org> > > Since northd tracked data has the changed lb data, northd > engine handler for lflow engine now handles the lb changes > incrementally. All the lflows generated for each lb is > stored in the ovn_lb_datapaths->lflow_ref and this is used > similar to how we handle ovn_port changes. > > Signed-off-by: Numan Siddique <num...@ovn.org> > --- > northd/en-lflow.c | 11 ++--- > northd/lb.c | 3 ++ > northd/lb.h | 26 ++++++++++++ > northd/lflow-mgr.c | 47 +++++++++++++++++----- > northd/northd.c | 98 +++++++++++++++++++++++++++++++++++++++------ > northd/northd.h | 4 ++ > tests/ovn-northd.at | 30 ++++++++++---- > 7 files changed, 184 insertions(+), 35 deletions(-) > > diff --git a/northd/en-lflow.c b/northd/en-lflow.c > index fef9a1352d..205605578f 100644 > --- a/northd/en-lflow.c > +++ b/northd/en-lflow.c > @@ -123,11 +123,6 @@ lflow_northd_handler(struct engine_node *node, > return false; > } > > - /* Fall back to recompute if load balancers have changed. */ > - if (northd_has_lbs_in_tracked_data(&northd_data->trk_data)) { > - return false; > - } > - > const struct engine_context *eng_ctx = engine_get_context(); > struct lflow_data *lflow_data = data; > > @@ -140,6 +135,12 @@ lflow_northd_handler(struct engine_node *node, > return false; > } > > + if (!lflow_handle_northd_lb_changes(eng_ctx->ovnsb_idl_txn, > + &northd_data->trk_data.trk_lbs, > + &lflow_input, lflow_data->lflow_table)) { > + return false; > + } > + > engine_set_node_state(node, EN_UPDATED); > return true; > } > diff --git a/northd/lb.c b/northd/lb.c > index e6c8a51911..5fca41e049 100644 > --- a/northd/lb.c > +++ b/northd/lb.c > @@ -21,6 +21,7 @@ > > /* OVN includes */ > #include "lb.h" > +#include "lflow-mgr.h" > #include "lib/lb.h" > #include "northd.h" > > @@ -33,6 +34,7 @@ ovn_lb_datapaths_create(const struct ovn_northd_lb *lb, size_t n_ls_datapaths, > lb_dps->lb = lb; > lb_dps->nb_ls_map = bitmap_allocate(n_ls_datapaths); > lb_dps->nb_lr_map = bitmap_allocate(n_lr_datapaths); > + lb_dps->lflow_ref = lflow_ref_create(); > > return lb_dps; > } > @@ -42,6 +44,7 @@ ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *lb_dps) > { > bitmap_free(lb_dps->nb_lr_map); > bitmap_free(lb_dps->nb_ls_map); > + lflow_ref_destroy(lb_dps->lflow_ref); > free(lb_dps); > } > > diff --git a/northd/lb.h b/northd/lb.h > index eeef2ea260..de677ca4ef 100644 > --- a/northd/lb.h > +++ b/northd/lb.h > @@ -20,6 +20,8 @@ > #include "openvswitch/hmap.h" > #include "uuid.h" > > +struct lflow_ref; > + > struct ovn_lb_datapaths { > struct hmap_node hmap_node; > > @@ -29,6 +31,30 @@ struct ovn_lb_datapaths { > > size_t n_nb_lr; > unsigned long *nb_lr_map; > + > + /* Reference of lflows generated for this load balancer. > + * > + * This data is initialized and destroyed by the en_northd node, but > + * populated and used only by the en_lflow node. Ideally this data should > + * be maintained as part of en_lflow's data (struct lflow_data): a hash > + * index from ovn_port key to lflows. However, it would be less efficient > + * and more complex: > + * > + * 1. It would require an extra search (using the index) to find the > + * lflows. > + * > + * 2. Building the index needs to be thread-safe, using either a global > + * lock which is obviously less efficient, or hash-based lock array which > + * is more complex. > + * > + * Maintaining the lflow_ref here is more straightforward. The drawback is > + * that we need to keep in mind that this data belongs to en_lflow node, > + * so never access it from any other nodes. > + * > + * 'lflow_ref' is used to reference logical flows generated for this > + * load balancer. > + */ > + struct lflow_ref *lflow_ref; > }; > > struct ovn_lb_datapaths *ovn_lb_datapaths_create(const struct ovn_northd_lb *, > diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c > index 3cf9696f6e..6cb2a367fe 100644 > --- a/northd/lflow-mgr.c > +++ b/northd/lflow-mgr.c > @@ -375,7 +375,15 @@ struct lflow_ref_node { > /* The lflow. */ > struct ovn_lflow *lflow; > > - /* Index id of the datapath this lflow_ref_node belongs to. */ > + /* Indicates of the lflow was added with dp_group or not using > + * ovn_lflow_add_with_dp_group() macro. */
nit: the sentence is a little confusing. Probably more clear to say: indicates whether the lflow was added with a dp_group using the ovn_lflow_add_with_dp_group() macro. > + bool dpgrp_lflow; > + /* dpgrp bitmap and bitmap length. Valid only of dpgrp_lflow is true. */ > + unsigned long *dpgrp_bitmap; > + size_t dpgrp_bitmap_len; > + > + /* Index id of the datapath this lflow_ref_node belongs to. > + * Valid only if dpgrp_lflow is false. */ > size_t dp_index; > > /* Indicates if the lflow_ref_node for an lflow - L(M, A) is linked > @@ -429,9 +437,19 @@ lflow_ref_unlink_lflows(struct lflow_ref *lflow_ref) The comment of this function needs to be updated for the below change: it clears all DP bits if it is generated from DPG directly. > struct lflow_ref_node *lrn; > > LIST_FOR_EACH (lrn, lflow_list_node, &lflow_ref->lflows_ref_list) { > - if (dec_dp_refcnt(&lrn->lflow->dp_refcnts_map, > - lrn->dp_index)) { > - bitmap_set0(lrn->lflow->dpg_bitmap, lrn->dp_index); > + if (lrn->dpgrp_lflow) { > + size_t index; > + BITMAP_FOR_EACH_1 (index, lrn->dpgrp_bitmap_len, > + lrn->dpgrp_bitmap) { > + if (dec_dp_refcnt(&lrn->lflow->dp_refcnts_map, index)) { > + bitmap_set0(lrn->lflow->dpg_bitmap, lrn->dp_index); This is wrong. Should use "index" instead of lrn->dp_index here. It is fixed in a future patch but should actually be fixed in this patch. With these addressed: Acked-by: Han Zhou <hz...@ovn.org> Thanks, Han > + } > + } > + } else { > + if (dec_dp_refcnt(&lrn->lflow->dp_refcnts_map, > + lrn->dp_index)) { > + bitmap_set0(lrn->lflow->dpg_bitmap, lrn->dp_index); > + } > } > > lrn->linked = false; > @@ -502,18 +520,26 @@ lflow_table_add_lflow(struct lflow_table *lflow_table, > io_port, ctrl_meter, stage_hint, where); > > if (lflow_ref) { > - /* lflow referencing is only supported if 'od' is not NULL. */ > - ovs_assert(od); > - > struct lflow_ref_node *lrn = > lflow_ref_node_find(&lflow_ref->lflow_ref_nodes, lflow, hash); > if (!lrn) { > lrn = xzalloc(sizeof *lrn); > lrn->lflow = lflow; > - lrn->dp_index = od->index; > + lrn->dpgrp_lflow = !od; > + if (lrn->dpgrp_lflow) { > + lrn->dpgrp_bitmap = bitmap_clone(dp_bitmap, dp_bitmap_len); > + lrn->dpgrp_bitmap_len = dp_bitmap_len; > + > + size_t index; > + BITMAP_FOR_EACH_1 (index, dp_bitmap_len, dp_bitmap) { > + inc_dp_refcnt(&lflow->dp_refcnts_map, index); > + } > + } else { > + lrn->dp_index = od->index; > + inc_dp_refcnt(&lflow->dp_refcnts_map, lrn->dp_index); > + } > ovs_list_insert(&lflow_ref->lflows_ref_list, > &lrn->lflow_list_node); > - inc_dp_refcnt(&lflow->dp_refcnts_map, lrn->dp_index); > ovs_list_insert(&lflow->referenced_by, &lrn->ref_list_node); > > hmap_insert(&lflow_ref->lflow_ref_nodes, &lrn->ref_node, hash); > @@ -1257,5 +1283,8 @@ lflow_ref_node_destroy(struct lflow_ref_node *lrn, > } > ovs_list_remove(&lrn->lflow_list_node); > ovs_list_remove(&lrn->ref_list_node); > + if (lrn->dpgrp_lflow) { > + bitmap_free(lrn->dpgrp_bitmap); > + } > free(lrn); > } > diff --git a/northd/northd.c b/northd/northd.c > index 08732abbfa..6225dfe541 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -7477,7 +7477,7 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows, > ovn_lflow_add_with_dp_group( > lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths), > S_SWITCH_IN_PRE_STATEFUL, 120, ds_cstr(match), ds_cstr(action), > - &lb->nlb->header_, NULL); > + &lb->nlb->header_, lb_dps->lflow_ref); > } > } > > @@ -7922,7 +7922,7 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps, > } > > build_lb_affinity_ls_flows(lflows, lb_dps, lb_vip, ls_datapaths, > - NULL); > + lb_dps->lflow_ref); > > unsigned long *dp_non_meter = NULL; > bool build_non_meter = false; > @@ -7946,7 +7946,7 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps, > lflows, od, S_SWITCH_IN_LB, priority, > ds_cstr(match), ds_cstr(action), > NULL, meter, &lb->nlb->header_, > - NULL); > + lb_dps->lflow_ref); > } > } > if (!reject || build_non_meter) { > @@ -7954,7 +7954,7 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps, > lflows, dp_non_meter ? dp_non_meter : lb_dps->nb_ls_map, > ods_size(ls_datapaths), S_SWITCH_IN_LB, priority, > ds_cstr(match), ds_cstr(action), &lb->nlb->header_, > - NULL); > + lb_dps->lflow_ref); > } > bitmap_free(dp_non_meter); > } > @@ -9375,7 +9375,7 @@ build_lswitch_arp_nd_service_monitor(const struct ovn_lb_datapaths *lb_dps, > S_SWITCH_IN_ARP_ND_RSP, 110, > ds_cstr(match), ds_cstr(actions), > &lb->nlb->header_, > - NULL); > + lb_dps->lflow_ref); > } > } > } > @@ -11397,7 +11397,8 @@ build_lrouter_nat_flows_for_lb( > if (!od->n_l3dgw_ports) { > bitmap_set1(gw_dp_bitmap[type], index); > } else { > - build_distr_lrouter_nat_flows_for_lb(&ctx, type, od, NULL); > + build_distr_lrouter_nat_flows_for_lb(&ctx, type, od, > + lb_dps->lflow_ref); > } > > if (lb->affinity_timeout) { > @@ -11418,17 +11419,17 @@ build_lrouter_nat_flows_for_lb( > * S_ROUTER_IN_DNAT stage. */ > ovn_lflow_add_with_hint(lflows, od, S_ROUTER_IN_UNSNAT, 120, > ds_cstr(&unsnat_match), "next;", > - &lb->nlb->header_, NULL); > + &lb->nlb->header_, lb_dps->lflow_ref); > } > } > > for (size_t type = 0; type < LROUTER_NAT_LB_FLOW_MAX; type++) { > build_gw_lrouter_nat_flows_for_lb(&ctx, type, lr_datapaths, > gw_dp_bitmap[type], > - NULL); > + lb_dps->lflow_ref); > build_lb_affinity_lr_flows(lflows, lb, lb_vip, ds_cstr(match), > aff_action[type], aff_dp_bitmap[type], > - lr_datapaths, NULL); > + lr_datapaths, lb_dps->lflow_ref); > } > > ds_destroy(&unsnat_match); > @@ -11477,7 +11478,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths *lb_dps, > od->nbs->copp, > meter_groups), > &lb->nlb->header_, > - NULL); > + lb_dps->lflow_ref); > } > /* Ignore L4 port information in the key because fragmented packets > * may not have L4 information. The pre-stateful table will send > @@ -11527,7 +11528,7 @@ build_lrouter_defrag_flows_for_lb(struct ovn_lb_datapaths *lb_dps, > ovn_lflow_add_with_dp_group( > lflows, lb_dps->nb_lr_map, ods_size(lr_datapaths), > S_ROUTER_IN_DEFRAG, prio, ds_cstr(match), "ct_dnat;", > - &lb_dps->lb->nlb->header_, NULL); > + &lb_dps->lb->nlb->header_, lb_dps->lflow_ref); > } > } > > @@ -11569,7 +11570,7 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths *lb_dps, > copp_meter_get(COPP_EVENT_ELB, > od->nbr->copp, > meter_groups), > - &lb->nlb->header_, NULL); > + &lb->nlb->header_, lb_dps->lflow_ref); > } > } > > @@ -11579,7 +11580,7 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths *lb_dps, > > ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 120, > "flags.skip_snat_for_lb == 1 && ip", "next;", > - NULL); > + lb_dps->lflow_ref); > } > } > } > @@ -16388,6 +16389,7 @@ void build_lflows(struct ovsdb_idl_txn *ovnsb_txn, > void > lflow_reset_northd_refs(struct lflow_input *lflow_input) > { > + struct ovn_lb_datapaths *lb_dps; > struct ovn_port *op; > > HMAP_FOR_EACH (op, key_node, lflow_input->ls_ports) { > @@ -16399,6 +16401,10 @@ lflow_reset_northd_refs(struct lflow_input *lflow_input) > lflow_ref_clear(op->lflow_ref); > lflow_ref_clear(op->stateful_lflow_ref); > } > + > + HMAP_FOR_EACH (lb_dps, hmap_node, lflow_input->lb_datapaths_map) { > + lflow_ref_clear(lb_dps->lflow_ref); > + } > } > > bool > @@ -16575,6 +16581,72 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn, > return true; > } > > +bool > +lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn, > + struct tracked_lbs *trk_lbs, > + struct lflow_input *lflow_input, > + struct lflow_table *lflows) > +{ > + struct ovn_lb_datapaths *lb_dps; > + struct hmapx_node *hmapx_node; > + HMAPX_FOR_EACH (hmapx_node, &trk_lbs->deleted) { > + lb_dps = hmapx_node->data; > + > + lflow_ref_resync_flows( > + lb_dps->lflow_ref, 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); > + } > + > + HMAPX_FOR_EACH (hmapx_node, &trk_lbs->crupdated) { > + lb_dps = hmapx_node->data; > + > + /* unlink old lflows. */ > + lflow_ref_unlink_lflows(lb_dps->lflow_ref); > + > + /* Generate new lflows. */ > + struct ds match = DS_EMPTY_INITIALIZER; > + struct ds actions = DS_EMPTY_INITIALIZER; > + > + build_lswitch_arp_nd_service_monitor(lb_dps, lflow_input->ls_ports, > + lflows, &actions, > + &match); > + build_lrouter_defrag_flows_for_lb(lb_dps, lflows, > + lflow_input->lr_datapaths, &match); > + build_lrouter_flows_for_lb(lb_dps, lflows, > + lflow_input->meter_groups, > + lflow_input->lr_datapaths, > + lflow_input->lr_stateful_table, > + lflow_input->features, > + lflow_input->svc_monitor_map, > + &match, &actions); > + build_lswitch_flows_for_lb(lb_dps, lflows, > + lflow_input->meter_groups, > + lflow_input->ls_datapaths, > + lflow_input->features, > + lflow_input->svc_monitor_map, > + &match, &actions); > + > + ds_destroy(&match); > + ds_destroy(&actions); > + > + /* Sync the new flows to SB. */ > + bool handled = lflow_ref_sync_lflows( > + lb_dps->lflow_ref, 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) { > + return false; > + } > + } > + > + return true; > +} > + > static bool > mirror_needs_update(const struct nbrec_mirror *nb_mirror, > const struct sbrec_mirror *sb_mirror) > diff --git a/northd/northd.h b/northd/northd.h > index 42b4eee607..d2640f38d7 100644 > --- a/northd/northd.h > +++ b/northd/northd.h > @@ -675,6 +675,10 @@ bool lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn, > struct tracked_ovn_ports *, > struct lflow_input *, > struct lflow_table *lflows); > +bool lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn, > + struct tracked_lbs *, > + struct lflow_input *, > + struct lflow_table *lflows); > bool northd_handle_sb_port_binding_changes( > const struct sbrec_port_binding_table *, struct hmap *ls_ports, > struct hmap *lr_ports); > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at > index f7d47fc7e4..80374444fd 100644 > --- a/tests/ovn-northd.at > +++ b/tests/ovn-northd.at > @@ -10519,7 +10519,7 @@ check ovn-nbctl --wait=sb lb-add lb1 10.0.0.10:80 10.0.0.3:80 > > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > > CHECK_NO_CHANGE_AFTER_RECOMPUTE(1) > @@ -10529,21 +10529,26 @@ check ovn-nbctl --wait=sb set load_balancer . ip_port_mappings:10.0.0.3=sw0-p1:1 > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > > +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb set load_balancer . options:foo=bar > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > > check ovn-nbctl --wait=sb -- lb-add lb2 20.0.0.10:80 20.0.0.20:80 -- lb-add lb3 30.0.0.10:80 30.0.0.20:80 > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > > CHECK_NO_CHANGE_AFTER_RECOMPUTE(1) > @@ -10553,7 +10558,7 @@ check ovn-nbctl --wait=sb -- lb-del lb2 -- lb-del lb3 > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > > CHECK_NO_CHANGE_AFTER_RECOMPUTE(1) > @@ -10764,8 +10769,9 @@ check ovn-nbctl --wait=sb add load_balancer_group . load_Balancer $lb1_uuid > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb clear load_balancer_group . load_Balancer > @@ -10780,7 +10786,7 @@ check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb add load_balancer_group . load_Balancer $lb1_uuid > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > CHECK_NO_CHANGE_AFTER_RECOMPUTE > > @@ -10789,6 +10795,7 @@ check ovn-nbctl --wait=sb add logical_switch sw0 load_balancer_group $lbg1_uuid > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > +check_engine_stats ls_stateful norecompute compute > check_engine_stats lflow recompute nocompute > check_engine_stats sync_to_sb_lb recompute compute > > @@ -10797,6 +10804,7 @@ check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb set load_balancer . options:bar=foo > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > +check_engine_stats ls_stateful norecompute compute > check_engine_stats lflow recompute nocompute > check_engine_stats sync_to_sb_lb recompute compute > > @@ -10806,6 +10814,7 @@ check ovn-nbctl --wait=sb set load_balancer lb1 vips:'"10.0.0.10:80"'='"10.0.0.1 > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > +check_engine_stats ls_stateful norecompute compute > check_engine_stats lflow recompute nocompute > check_engine_stats sync_to_sb_lb recompute compute > CHECK_NO_CHANGE_AFTER_RECOMPUTE > @@ -10903,6 +10912,7 @@ check_engine_stats northd recompute nocompute > check_engine_stats lr_stateful recompute nocompute > check_engine_stats lflow recompute nocompute > check_engine_stats sync_to_sb_lb recompute compute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > > # Add back lb group to logical switch and then delete it. > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > @@ -10912,6 +10922,7 @@ check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > check_engine_stats lflow recompute nocompute > check_engine_stats sync_to_sb_lb recompute compute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb clear logical_switch sw0 load_balancer_group -- \ > @@ -10945,14 +10956,17 @@ check_engine_stats northd norecompute compute > check_engine_stats lr_stateful norecompute compute > check_engine_stats lflow norecompute nocompute > check_engine_stats sync_to_sb_lb norecompute nocompute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb set load_balancer_group . load_balancer="$lb2_uuid,$lb3_uuid,$lb4_uuid" > check_engine_stats lb_data norecompute compute > check_engine_stats northd norecompute compute > +check_engine_stats ls_stateful norecompute compute > check_engine_stats lr_stateful norecompute compute > -check_engine_stats lflow recompute nocompute > +check_engine_stats lflow norecompute compute > check_engine_stats sync_to_sb_lb recompute nocompute > +CHECK_NO_CHANGE_AFTER_RECOMPUTE > > check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats > check ovn-nbctl --wait=sb set logical_switch sw0 load_balancer_group=$lbg1_uuid > -- > 2.43.0 > > _______________________________________________ > 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