On Tue, Dec 16, 2025 at 7:45 PM Mark Michelson via dev < [email protected]> wrote:
> This commit changes the lflow syncing functions to no longer use > ovn_datapaths in favor of ovn_synced_datapaths. Rather than passing > individual switch and router maps, we pass an array of all datapath > types. We can then select the map we want using the const index values > DP_SWITCH and DP_ROUTER. As new datapath types get added, this will > automatically accommodate those without having to change the functions. > > This change sprawled out a bit, since the syncing functions call further > functions that in turn used ovn_datapaths. Since this required us to > change ovn_dp_group_create(), we also had to update the en-sync-sb > code as part of this commit. > > nit: Missing Reported-at tag. > Signed-off-by: Mark Michelson <[email protected]> > --- > northd/en-lflow.c | 22 +++--- > northd/en-sync-sb.c | 47 ++++++------- > northd/inc-proc-northd.c | 3 + > northd/lflow-mgr.c | 111 ++++++++++++------------------- > northd/lflow-mgr.h | 11 ++- > northd/northd.c | 37 ++++------- > northd/northd.h | 1 + > tests/ovn-inc-proc-graph-dump.at | 2 + > 8 files changed, 100 insertions(+), 134 deletions(-) > > diff --git a/northd/en-lflow.c b/northd/en-lflow.c > index 6512b70b0..41a5a97ff 100644 > --- a/northd/en-lflow.c > +++ b/northd/en-lflow.c > @@ -29,6 +29,7 @@ > #include "en-meters.h" > #include "en-sampling-app.h" > #include "en-group-ecmp-route.h" > +#include "en-datapath-sync.h" > #include "lflow-mgr.h" > > #include "lib/inc-proc-eng.h" > @@ -69,6 +70,8 @@ lflow_get_input_data(struct engine_node *node, > engine_get_input_data("multicast_igmp", node); > struct ic_learned_svc_monitors_data *ic_learned_svc_monitors_data = > engine_get_input_data("ic_learned_svc_monitors", node); > + struct all_synced_datapaths *all_dps = > + engine_get_input_data("datapath_sync", node); > > lflow_input->sbrec_logical_flow_table = > EN_OVSDB_GET(engine_get_input("SB_logical_flow", node)); > @@ -115,6 +118,7 @@ lflow_get_input_data(struct engine_node *node, > struct ed_type_sampling_app_data *sampling_app_data = > engine_get_input_data("sampling_app", node); > lflow_input->sampling_apps = &sampling_app_data->apps; > + lflow_input->dps = all_dps->synced_dps; > } > > enum engine_node_state > @@ -269,8 +273,7 @@ lflow_multicast_igmp_handler(struct engine_node *node, > void *data) > if (!lflow_ref_resync_flows(mcast_igmp_data->lflow_ref, > lflow_data->lflow_table, > eng_ctx->ovnsb_idl_txn, > - lflow_input.ls_datapaths, > - lflow_input.lr_datapaths, > + lflow_input.dps, > lflow_input.ovn_internal_version_changed, > lflow_input.sbrec_logical_flow_table, > > lflow_input.sbrec_logical_dp_group_table)) { > @@ -285,8 +288,7 @@ lflow_multicast_igmp_handler(struct engine_node *node, > void *data) > if (!lflow_ref_sync_lflows(mcast_igmp_data->lflow_ref, > lflow_data->lflow_table, > eng_ctx->ovnsb_idl_txn, > - lflow_input.ls_datapaths, > - lflow_input.lr_datapaths, > + lflow_input.dps, > lflow_input.ovn_internal_version_changed, > lflow_input.sbrec_logical_flow_table, > lflow_input.sbrec_logical_dp_group_table)) > { > @@ -326,8 +328,7 @@ lflow_group_ecmp_route_change_handler(struct > engine_node *node, > > bool handled = lflow_ref_sync_lflows( > route_node->lflow_ref, lflow_data->lflow_table, > - eng_ctx->ovnsb_idl_txn, lflow_input.ls_datapaths, > - lflow_input.lr_datapaths, > + eng_ctx->ovnsb_idl_txn, lflow_input.dps, > lflow_input.ovn_internal_version_changed, > lflow_input.sbrec_logical_flow_table, > lflow_input.sbrec_logical_dp_group_table); > @@ -348,8 +349,7 @@ lflow_group_ecmp_route_change_handler(struct > engine_node *node, > > bool handled = lflow_ref_sync_lflows( > route_node->lflow_ref, lflow_data->lflow_table, > - eng_ctx->ovnsb_idl_txn, lflow_input.ls_datapaths, > - lflow_input.lr_datapaths, > + eng_ctx->ovnsb_idl_txn, lflow_input.dps, > lflow_input.ovn_internal_version_changed, > lflow_input.sbrec_logical_flow_table, > lflow_input.sbrec_logical_dp_group_table); > @@ -383,8 +383,7 @@ lflow_ic_learned_svc_mons_handler(struct engine_node > *node, > ic_learned_svc_monitors_data->lflow_ref, > lflow_data->lflow_table, > eng_ctx->ovnsb_idl_txn, > - lflow_input.ls_datapaths, > - lflow_input.lr_datapaths, > + lflow_input.dps, > lflow_input.ovn_internal_version_changed, > lflow_input.sbrec_logical_flow_table, > lflow_input.sbrec_logical_dp_group_table)) { > @@ -401,8 +400,7 @@ lflow_ic_learned_svc_mons_handler(struct engine_node > *node, > ic_learned_svc_monitors_data->lflow_ref, > lflow_data->lflow_table, > eng_ctx->ovnsb_idl_txn, > - lflow_input.ls_datapaths, > - lflow_input.lr_datapaths, > + lflow_input.dps, > lflow_input.ovn_internal_version_changed, > lflow_input.sbrec_logical_flow_table, > lflow_input.sbrec_logical_dp_group_table)) { > diff --git a/northd/en-sync-sb.c b/northd/en-sync-sb.c > index 8c8c5de05..bc0d74712 100644 > --- a/northd/en-sync-sb.c > +++ b/northd/en-sync-sb.c > @@ -27,6 +27,7 @@ > #include "en-global-config.h" > #include "en-lr-stateful.h" > #include "en-sync-sb.h" > +#include "en-datapath-sync.h" > #include "lb.h" > #include "lib/inc-proc-eng.h" > #include "lib/lb.h" > @@ -250,24 +251,21 @@ static void sb_lb_table_build_and_sync(struct > sb_lb_table *, > const struct sbrec_load_balancer_table *, > const struct sbrec_logical_dp_group_table > *, > struct hmap *lb_dps_map, > - struct ovn_datapaths *ls_datapaths, > - struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths > dps[DP_MAX], > struct chassis_features *); > static bool sync_sb_lb_record(struct sb_lb_record *, > const struct sbrec_load_balancer *, > const struct sbrec_logical_dp_group_table *, > struct sb_lb_table *, > struct ovsdb_idl_txn *ovnsb_txn, > - struct ovn_datapaths *ls_datapaths, > - struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths > dps[DP_MAX], > struct chassis_features *); > static bool sync_changed_lbs(struct sb_lb_table *, > struct ovsdb_idl_txn *ovnsb_txn, > const struct sbrec_load_balancer_table *, > const struct sbrec_logical_dp_group_table *, > struct tracked_lbs *, > - struct ovn_datapaths *ls_datapaths, > - struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths > dps[DP_MAX], > struct chassis_features *); > > void * > @@ -290,6 +288,8 @@ en_sync_to_sb_lb_run(struct engine_node *node, void > *data_) > EN_OVSDB_GET(engine_get_input("SB_logical_dp_group", node)); > struct ed_type_global_config *global_config = > engine_get_input_data("global_config", node); > + const struct all_synced_datapaths *all_dps = > + engine_get_input_data("datapath_sync", node); > const struct engine_context *eng_ctx = engine_get_context(); > struct ed_type_sync_to_sb_lb_data *data = data_; > > @@ -298,8 +298,7 @@ en_sync_to_sb_lb_run(struct engine_node *node, void > *data_) > sb_load_balancer_table, > sb_dpgrp_table, > &northd_data->lb_datapaths_map, > - &northd_data->ls_datapaths, > - &northd_data->lr_datapaths, > + all_dps->synced_dps, > &global_config->features); > > return EN_UPDATED; > @@ -333,11 +332,13 @@ sync_to_sb_lb_northd_handler(struct engine_node > *node, void *data_) > EN_OVSDB_GET(engine_get_input("SB_load_balancer", node)); > struct ed_type_global_config *global_config = > engine_get_input_data("global_config", node); > + const struct all_synced_datapaths *all_dps = > + engine_get_input_data("datapath_sync", node); > struct ed_type_sync_to_sb_lb_data *data = data_; > > if (!sync_changed_lbs(&data->sb_lbs, eng_ctx->ovnsb_idl_txn, > sb_lb_table, > sb_dpgrp_table, &nd->trk_data.trk_lbs, > - &nd->ls_datapaths, &nd->lr_datapaths, > + all_dps->synced_dps, > &global_config->features)) { > return EN_UNHANDLED; > } > @@ -690,8 +691,8 @@ sb_lb_table_build_and_sync( > struct sb_lb_table *sb_lbs, struct ovsdb_idl_txn *ovnsb_txn, > const struct sbrec_load_balancer_table *sb_lb_table, > const struct sbrec_logical_dp_group_table *sb_dpgrp_table, > - struct hmap *lb_dps_map, struct ovn_datapaths *ls_datapaths, > - struct ovn_datapaths *lr_datapaths, > + struct hmap *lb_dps_map, > + const struct ovn_synced_datapaths dps[DP_MAX], > struct chassis_features *chassis_features) > { > struct hmap tmp_sb_lbs = HMAP_INITIALIZER(&tmp_sb_lbs); > @@ -717,8 +718,8 @@ sb_lb_table_build_and_sync( > if (sb_lb) { > sb_lb->sbrec_lb = sbrec_lb; > bool success = sync_sb_lb_record(sb_lb, sbrec_lb, > sb_dpgrp_table, > - sb_lbs, ovnsb_txn, > ls_datapaths, > - lr_datapaths, > chassis_features); > + sb_lbs, ovnsb_txn, dps, > + chassis_features); > /* Since we are rebuilding and syncing, sync_sb_lb_record > should > * not return false. */ > ovs_assert(success); > @@ -733,8 +734,7 @@ sb_lb_table_build_and_sync( > > HMAP_FOR_EACH_POP (sb_lb, key_node, &tmp_sb_lbs) { > bool success = sync_sb_lb_record(sb_lb, NULL, sb_dpgrp_table, > sb_lbs, > - ovnsb_txn, ls_datapaths, > lr_datapaths, > - chassis_features); > + ovnsb_txn, dps, > chassis_features); > /* Since we are rebuilding and syncing, sync_sb_lb_record should > not > * return false. */ > ovs_assert(success); > @@ -752,8 +752,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > const struct sbrec_logical_dp_group_table > *sb_dpgrp_table, > struct sb_lb_table *sb_lbs, > struct ovsdb_idl_txn *ovnsb_txn, > - struct ovn_datapaths *ls_datapaths, > - struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > struct chassis_features *chassis_features) > { > struct sbrec_logical_dp_group *sbrec_ls_dp_group = NULL; > @@ -781,7 +780,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > if (!dynamic_bitmap_is_empty(&lb_dps->nb_ls_map)) { > sb_lb->ls_dpg = ovn_dp_group_get(&sb_lbs->ls_dp_groups, > &lb_dps->nb_ls_map, > - ods_size(ls_datapaths)); > + dps[DP_SWITCH].dps_array.len); > if (sb_lb->ls_dpg) { > /* Update the dpg's sb dp_group. */ > sb_lb->ls_dpg->dp_group = > @@ -810,7 +809,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > } else { > sb_lb->ls_dpg = ovn_dp_group_create( > ovnsb_txn, &sb_lbs->ls_dp_groups, sbrec_ls_dp_group, > - &lb_dps->nb_ls_map, ls_datapaths); > + &lb_dps->nb_ls_map, &dps[DP_SWITCH]); > } > > if (chassis_features->ls_dpg_column) { > @@ -833,7 +832,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > if (!dynamic_bitmap_is_empty(&lb_dps->nb_lr_map)) { > sb_lb->lr_dpg = ovn_dp_group_get(&sb_lbs->lr_dp_groups, > &lb_dps->nb_lr_map, > - ods_size(lr_datapaths)); > + dps[DP_ROUTER].dps_array.len); > if (sb_lb->lr_dpg) { > /* Update the dpg's sb dp_group. */ > sb_lb->lr_dpg->dp_group = > @@ -862,7 +861,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > } else { > sb_lb->lr_dpg = ovn_dp_group_create( > ovnsb_txn, &sb_lbs->lr_dp_groups, sbrec_lr_dp_group, > - &lb_dps->nb_lr_map, lr_datapaths); > + &lb_dps->nb_lr_map, &dps[DP_ROUTER]); > } > > sbrec_load_balancer_set_lr_datapath_group(sbrec_lb, > @@ -907,8 +906,7 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs, > const struct sbrec_load_balancer_table *sb_lb_table, > const struct sbrec_logical_dp_group_table > *sb_dpgrp_table, > struct tracked_lbs *trk_lbs, > - struct ovn_datapaths *ls_datapaths, > - struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > struct chassis_features *chassis_features) > { > struct ovn_lb_datapaths *lb_dps; > @@ -967,8 +965,7 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs, > } > > if (!sync_sb_lb_record(sb_lb, sb_lb->sbrec_lb, sb_dpgrp_table, > sb_lbs, > - ovnsb_txn, ls_datapaths, lr_datapaths, > - chassis_features)) { > + ovnsb_txn, dps, chassis_features)) { > return false; > } > } > diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c > index b9ac33dc3..cbaebfbf1 100644 > --- a/northd/inc-proc-northd.c > +++ b/northd/inc-proc-northd.c > @@ -406,6 +406,7 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, > > engine_add_input(&en_lflow, &en_sampling_app, NULL); > > + engine_add_input(&en_lflow, &en_datapath_sync, engine_noop_handler); > engine_add_input(&en_lflow, &en_northd, lflow_northd_handler); > /* No need for an explicit handler for port_groups in the en_lflow > node. > * Stateful configuration changes are passed through the > en_ls_stateful > @@ -441,6 +442,8 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, > > engine_add_input(&en_sync_to_sb_lb, &en_global_config, > node_global_config_handler); > + engine_add_input(&en_sync_to_sb_lb, &en_datapath_sync, > + engine_noop_handler); > nit: Missing comment why noop handler is used. > engine_add_input(&en_sync_to_sb_lb, &en_northd, > sync_to_sb_lb_northd_handler); > engine_add_input(&en_sync_to_sb_lb, &en_sb_load_balancer, > diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c > index 21a47021b..87380962b 100644 > --- a/northd/lflow-mgr.c > +++ b/northd/lflow-mgr.c > @@ -67,7 +67,7 @@ static struct sbrec_logical_dp_group > *ovn_sb_insert_or_update_logical_dp_group( > struct ovsdb_idl_txn *ovnsb_txn, > struct sbrec_logical_dp_group *, > const struct dynamic_bitmap *dpg_bitmap, > - const struct ovn_datapaths *); > + const struct ovn_synced_datapaths *); > static struct ovn_dp_group *ovn_dp_group_find( > const struct hmap *dp_groups, > const struct dynamic_bitmap *dpg_bitmap, > @@ -85,15 +85,14 @@ static void ovn_dp_group_add_with_reference( > static bool lflow_ref_sync_lflows__( > struct lflow_ref *, struct lflow_table *, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table *, > const struct sbrec_logical_dp_group_table *); > static bool sync_lflow_to_sb(struct ovn_lflow *, > struct ovsdb_idl_txn *ovnsb_txn, > struct hmap *dp_groups, > - const struct ovn_datapaths *datapaths, > + const struct ovn_synced_datapaths *datapaths, > bool ovn_internal_version_changed, > const struct sbrec_logical_flow *sbflow, > const struct sbrec_logical_dp_group_table *); > @@ -261,8 +260,7 @@ lflow_table_set_size(struct lflow_table *lflow_table, > size_t size) > void > lflow_table_sync_to_sb(struct lflow_table *lflow_table, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table > *sb_flow_table, > const struct sbrec_logical_dp_group_table > *dpgrp_table) > @@ -290,16 +288,12 @@ lflow_table_sync_to_sb(struct lflow_table > *lflow_table, > sbflow = sbrec_logical_flow_table_get_for_uuid(sb_flow_table, > > &lflow->sb_uuid); > } > - const struct ovn_datapaths *datapaths; > + const struct ovn_synced_datapaths *datapaths; > struct hmap *dp_groups; > enum ovn_datapath_type dp_type = > ovn_stage_to_datapath_type(lflow->stage); > dp_groups = &lflow_table->dp_groups[dp_type]; > - if (dp_type == DP_SWITCH) { > - datapaths = ls_datapaths; > - } else { > - datapaths = lr_datapaths; > - } > + datapaths = &dps[dp_type]; > sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths, > ovn_internal_version_changed, > sbflow, dpgrp_table); > @@ -320,31 +314,29 @@ lflow_table_sync_to_sb(struct lflow_table > *lflow_table, > uuidset_delete(&sb_uuid_set, node); > } > struct sbrec_logical_dp_group *dp_group = > sbflow->logical_dp_group; > - struct ovn_datapath *logical_datapath_od = NULL; > + struct ovn_synced_datapath *sdp = NULL; > size_t i; > > /* Find one valid datapath to get the datapath type. */ > struct sbrec_datapath_binding *dp = sbflow->logical_datapath; > if (dp) { > - logical_datapath_od = ovn_datapath_from_sbrec( > - &ls_datapaths->datapaths, &lr_datapaths->datapaths, dp); > - if (logical_datapath_od > - && ovn_datapath_is_stale(logical_datapath_od)) { > - logical_datapath_od = NULL; > - } > + enum ovn_datapath_type dp_type = > + ovn_datapath_type_from_string(datapath_get_nb_type(dp)); > + sdp = ovn_synced_datapath_from_sb(&dps[dp_type], dp); > } > for (i = 0; dp_group && i < dp_group->n_datapaths; i++) { > - logical_datapath_od = ovn_datapath_from_sbrec( > - &ls_datapaths->datapaths, &lr_datapaths->datapaths, > - dp_group->datapaths[i]); > - if (logical_datapath_od > - && !ovn_datapath_is_stale(logical_datapath_od)) { > + enum ovn_datapath_type dp_type = > + ovn_datapath_type_from_string(datapath_get_nb_type( > + dp_group->datapaths[i])); > + sdp = ovn_synced_datapath_from_sb(&dps[dp_type], > + dp_group->datapaths[i]); > + if (sdp) { > break; > } > - logical_datapath_od = NULL; > + sdp = NULL; > } > > - if (!logical_datapath_od) { > + if (!sdp) { > /* This lflow has no valid logical datapaths. */ > sbrec_logical_flow_delete(sbflow); > continue; > @@ -358,7 +350,7 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table, > = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT; > > enum ovn_datapath_type dp_type > - = ovn_datapath_get_type(logical_datapath_od); > + = > ovn_datapath_type_from_string(datapath_get_nb_type(sdp->sb_dp)); > > /* Since we should have weeded out sb_lflows with invalid > * datapaths, we should only get valid datapath types here. > @@ -372,14 +364,10 @@ lflow_table_sync_to_sb(struct lflow_table > *lflow_table, > sbflow->priority, sbflow->match, sbflow->actions, > sbflow->controller_meter, sbflow->hash); > if (lflow) { > - const struct ovn_datapaths *datapaths; > + const struct ovn_synced_datapaths *datapaths; > struct hmap *dp_groups; > dp_groups = &lflow_table->dp_groups[dp_type]; > - if (dp_type == DP_SWITCH) { > - datapaths = ls_datapaths; > - } else { > - datapaths = lr_datapaths; > - } > + datapaths = &dps[dp_type]; > sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths, > ovn_internal_version_changed, > sbflow, dpgrp_table); > @@ -396,16 +384,12 @@ lflow_table_sync_to_sb(struct lflow_table > *lflow_table, > if (search_mode != LFLOW_TABLE_SEARCH_FIELDS) { > break; > } > - const struct ovn_datapaths *datapaths; > + const struct ovn_synced_datapaths *datapaths; > struct hmap *dp_groups; > enum ovn_datapath_type dp_type = > ovn_stage_to_datapath_type(lflow->stage); > dp_groups = &lflow_table->dp_groups[dp_type]; > - if (dp_type == DP_SWITCH) { > - datapaths = ls_datapaths; > - } else { > - datapaths = lr_datapaths; > - } > + datapaths = &dps[dp_type]; > sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths, > ovn_internal_version_changed, NULL, dpgrp_table); > > @@ -691,15 +675,14 @@ bool > lflow_ref_resync_flows(struct lflow_ref *lflow_ref, > struct lflow_table *lflow_table, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table > *sbflow_table, > const struct sbrec_logical_dp_group_table > *dpgrp_table) > { > lflow_ref_unlink_lflows(lflow_ref); > return lflow_ref_sync_lflows__(lflow_ref, lflow_table, ovnsb_txn, > - ls_datapaths, lr_datapaths, > + dps, > ovn_internal_version_changed, > sbflow_table, > dpgrp_table); > } > @@ -708,14 +691,13 @@ bool > lflow_ref_sync_lflows(struct lflow_ref *lflow_ref, > struct lflow_table *lflow_table, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table *sbflow_table, > const struct sbrec_logical_dp_group_table > *dpgrp_table) > { > return lflow_ref_sync_lflows__(lflow_ref, lflow_table, ovnsb_txn, > - ls_datapaths, lr_datapaths, > + dps, > ovn_internal_version_changed, > sbflow_table, > dpgrp_table); > } > @@ -845,7 +827,7 @@ ovn_dp_group_create(struct ovsdb_idl_txn *ovnsb_txn, > struct hmap *dp_groups, > struct sbrec_logical_dp_group *sb_group, > const struct dynamic_bitmap *desired_bitmap, > - const struct ovn_datapaths *datapaths) > + const struct ovn_synced_datapaths *datapaths) > { > struct ovn_dp_group *dpg; > > @@ -855,14 +837,14 @@ ovn_dp_group_create(struct ovsdb_idl_txn *ovnsb_txn, > > dynamic_bitmap_alloc(&dpg_bitmap, desired_bitmap->capacity); > for (i = 0; sb_group && i < sb_group->n_datapaths; i++) { > - struct ovn_datapath *datapath_od; > + struct ovn_synced_datapath *sdp; > > - datapath_od = ovn_datapath_from_sbrec_(&datapaths->datapaths, > - sb_group->datapaths[i]); > - if (!datapath_od || ovn_datapath_is_stale(datapath_od)) { > + sdp = ovn_synced_datapath_from_sb(datapaths, > + sb_group->datapaths[i]); > + if (!sdp) { > break; > } > - dynamic_bitmap_set1(&dpg_bitmap, datapath_od->sdp->index); > + dynamic_bitmap_set1(&dpg_bitmap, sdp->index); > } > if (!sb_group || i != sb_group->n_datapaths) { > /* No group or stale group. Not going to be used. */ > @@ -1094,7 +1076,7 @@ static bool > sync_lflow_to_sb(struct ovn_lflow *lflow, > struct ovsdb_idl_txn *ovnsb_txn, > struct hmap *dp_groups, > - const struct ovn_datapaths *datapaths, > + const struct ovn_synced_datapaths *datapaths, > bool ovn_internal_version_changed, > const struct sbrec_logical_flow *sbflow, > const struct sbrec_logical_dp_group_table > *sb_dpgrp_table) > @@ -1103,7 +1085,7 @@ sync_lflow_to_sb(struct ovn_lflow *lflow, > struct ovn_dp_group *pre_sync_dpg = lflow->dpg; > size_t n_datapaths; > > - n_datapaths = ods_size(datapaths); > + n_datapaths = datapaths->dps_array.len; > > size_t n_ods = dynamic_bitmap_count1(&lflow->dpg_bitmap); > ovs_assert(n_ods); > @@ -1111,8 +1093,7 @@ sync_lflow_to_sb(struct ovn_lflow *lflow, > /* There is only one datapath, so it should be moved out of the > * group to a single 'od'. */ > size_t index = dynamic_bitmap_scan(&lflow->dpg_bitmap, true, 0); > - struct ovn_datapath *od = sparse_array_get(&datapaths->dps, > index); > - lflow->dp = od->sdp; > + lflow->dp = sparse_array_get(&datapaths->dps_array, index); > lflow->dpg = NULL; > } else { > lflow->dp = NULL; > @@ -1305,16 +1286,17 @@ ovn_sb_insert_or_update_logical_dp_group( > struct ovsdb_idl_txn *ovnsb_txn, > struct sbrec_logical_dp_group *dp_group, > const struct dynamic_bitmap *dpg_bitmap, > - const struct ovn_datapaths *datapaths) > + const struct ovn_synced_datapaths *datapaths) > { > const struct sbrec_datapath_binding **sb; > size_t n = 0, index; > > sb = xmalloc(dynamic_bitmap_count1(dpg_bitmap) * sizeof *sb); > DYNAMIC_BITMAP_FOR_EACH_1 (index, dpg_bitmap) { > - struct ovn_datapath *od = sparse_array_get(&datapaths->dps, > index); > - if (od) { > - sb[n++] = od->sdp->sb_dp; > + struct ovn_synced_datapath *sdp = > + sparse_array_get(&datapaths->dps_array, index); > + if (sdp) { > + sb[n++] = sdp->sb_dp; > } > } > if (!dp_group) { > @@ -1351,8 +1333,7 @@ static bool > lflow_ref_sync_lflows__(struct lflow_ref *lflow_ref, > struct lflow_table *lflow_table, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table > *sbflow_table, > const struct sbrec_logical_dp_group_table > *dpgrp_table) > @@ -1366,15 +1347,11 @@ lflow_ref_sync_lflows__(struct lflow_ref > *lflow_ref, > &lflow->sb_uuid); > > struct hmap *dp_groups = NULL; > - const struct ovn_datapaths *datapaths; > + const struct ovn_synced_datapaths *datapaths; > enum ovn_datapath_type dp_type = > ovn_stage_to_datapath_type(lflow->stage); > dp_groups = &lflow_table->dp_groups[dp_type]; > - if (dp_type == DP_SWITCH) { > - datapaths = ls_datapaths; > - } else { > - datapaths = lr_datapaths; > - } > + datapaths = &dps[dp_type]; > > size_t n_ods = dynamic_bitmap_count1(&lflow->dpg_bitmap); > > diff --git a/northd/lflow-mgr.h b/northd/lflow-mgr.h > index 9d9904c1e..53ee3c31f 100644 > --- a/northd/lflow-mgr.h > +++ b/northd/lflow-mgr.h > @@ -40,8 +40,7 @@ void lflow_table_expand(struct lflow_table *); > void lflow_table_set_size(struct lflow_table *, size_t); > void lflow_table_sync_to_sb(struct lflow_table *, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table *, > const struct sbrec_logical_dp_group_table *); > @@ -61,16 +60,14 @@ void lflow_ref_unlink_lflows(struct lflow_ref *); > bool lflow_ref_resync_flows(struct lflow_ref *, > struct lflow_table *lflow_table, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table *, > const struct sbrec_logical_dp_group_table *); > bool lflow_ref_sync_lflows(struct lflow_ref *, > struct lflow_table *lflow_table, > struct ovsdb_idl_txn *ovnsb_txn, > - const struct ovn_datapaths *ls_datapaths, > - const struct ovn_datapaths *lr_datapaths, > + const struct ovn_synced_datapaths dps[DP_MAX], > bool ovn_internal_version_changed, > const struct sbrec_logical_flow_table *, > const struct sbrec_logical_dp_group_table *); > @@ -188,7 +185,7 @@ struct ovn_dp_group *ovn_dp_group_create( > struct ovsdb_idl_txn *ovnsb_txn, struct hmap *dp_groups, > struct sbrec_logical_dp_group *sb_group, > const struct dynamic_bitmap *desired_bitmap, > - const struct ovn_datapaths *datapaths); > + const struct ovn_synced_datapaths *datapaths); > > static inline void > inc_ovn_dp_group_ref(struct ovn_dp_group *dpg) > diff --git a/northd/northd.c b/northd/northd.c > index a98a09ae2..aa726790a 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -19437,8 +19437,7 @@ void build_lflows(struct ovsdb_idl_txn *ovnsb_txn, > lflow_table_expand(lflows); > > stopwatch_start(LFLOWS_TO_SB_STOPWATCH_NAME, time_msec()); > - lflow_table_sync_to_sb(lflows, ovnsb_txn, input_data->ls_datapaths, > - input_data->lr_datapaths, > + lflow_table_sync_to_sb(lflows, ovnsb_txn, input_data->dps, > input_data->ovn_internal_version_changed, > input_data->sbrec_logical_flow_table, > input_data->sbrec_logical_dp_group_table); > @@ -19493,8 +19492,7 @@ lflow_handle_northd_port_changes(struct > ovsdb_idl_txn *ovnsb_txn, > /* Make sure 'op' is an lsp and not lrp. */ > ovs_assert(op->nbsp); > bool handled = lflow_ref_resync_flows( > - op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + op->lflow_ref, lflows, ovnsb_txn, lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19522,8 +19520,7 @@ lflow_handle_northd_port_changes(struct > ovsdb_idl_txn *ovnsb_txn, > lflows); > /* Sync the new flows to SB. */ > bool handled = lflow_ref_sync_lflows( > - op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + op->lflow_ref, lflows, ovnsb_txn, lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19536,8 +19533,7 @@ lflow_handle_northd_port_changes(struct > ovsdb_idl_txn *ovnsb_txn, > &match, &actions, lflows); > handled = lflow_ref_sync_lflows( > op->stateful_lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19582,8 +19578,7 @@ lflow_handle_northd_port_changes(struct > ovsdb_idl_txn *ovnsb_txn, > > /* Sync the newly added flows to SB. */ > bool handled = lflow_ref_sync_lflows( > - op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + op->lflow_ref, lflows, ovnsb_txn, lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19594,8 +19589,7 @@ lflow_handle_northd_port_changes(struct > ovsdb_idl_txn *ovnsb_txn, > &match, &actions, lflows); > handled = lflow_ref_sync_lflows( > op->stateful_lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19654,8 +19648,7 @@ lflow_handle_northd_lb_changes(struct > ovsdb_idl_txn *ovnsb_txn, > lb_dps = hmapx_node->data; > > lflow_ref_resync_flows( > - lb_dps->lflow_ref, lflows, ovnsb_txn, > lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + lb_dps->lflow_ref, lflows, ovnsb_txn, lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19694,8 +19687,7 @@ lflow_handle_northd_lb_changes(struct > ovsdb_idl_txn *ovnsb_txn, > > /* 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, > + lb_dps->lflow_ref, lflows, ovnsb_txn, lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19734,7 +19726,7 @@ lflow_handle_lr_stateful_changes(struct > ovsdb_idl_txn *ovnsb_txn, > /* Sync the new flows to SB. */ > handled = lflow_ref_sync_lflows( > lr_stateful_rec->lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19758,7 +19750,7 @@ lflow_handle_lr_stateful_changes(struct > ovsdb_idl_txn *ovnsb_txn, > > handled = lflow_ref_sync_lflows( > op->stateful_lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19775,7 +19767,7 @@ lflow_handle_lr_stateful_changes(struct > ovsdb_idl_txn *ovnsb_txn, > > handled = lflow_ref_sync_lflows( > op->peer->stateful_lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19832,8 +19824,7 @@ lflow_handle_ls_stateful_changes(struct > ovsdb_idl_txn *ovnsb_txn, > /* Sync the new flows to SB. */ > bool handled = lflow_ref_sync_lflows( > ls_stateful_rec->lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, > - lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > @@ -19847,7 +19838,7 @@ lflow_handle_ls_stateful_changes(struct > ovsdb_idl_txn *ovnsb_txn, > > if (!lflow_ref_resync_flows( > ls_stateful_rec->lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table)) { > @@ -19877,7 +19868,7 @@ lflow_handle_ls_arp_changes(struct ovsdb_idl_txn > *ovnsb_txn, > > bool handled = lflow_ref_sync_lflows( > ls_arp_record->lflow_ref, lflows, ovnsb_txn, > - lflow_input->ls_datapaths, lflow_input->lr_datapaths, > + lflow_input->dps, > lflow_input->ovn_internal_version_changed, > lflow_input->sbrec_logical_flow_table, > lflow_input->sbrec_logical_dp_group_table); > diff --git a/northd/northd.h b/northd/northd.h > index ffaa78d10..185bf4cb5 100644 > --- a/northd/northd.h > +++ b/northd/northd.h > @@ -266,6 +266,7 @@ struct lflow_input { > /* Indexes */ > struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp; > > + const struct ovn_synced_datapaths *dps; > const struct ovn_datapaths *ls_datapaths; > const struct ovn_datapaths *lr_datapaths; > const struct hmap *ls_ports; > diff --git a/tests/ovn-inc-proc-graph-dump.at b/tests/ > ovn-inc-proc-graph-dump.at > index eb00ccc7d..d77722adf 100644 > --- a/tests/ovn-inc-proc-graph-dump.at > +++ b/tests/ovn-inc-proc-graph-dump.at > @@ -124,6 +124,7 @@ digraph "Incremental-Processing-Engine" { > SB_logical_dp_group [[style=filled, shape=box, fillcolor=white, > label="SB_logical_dp_group"]]; > sync_to_sb_lb [[style=filled, shape=box, fillcolor=white, > label="sync_to_sb_lb"]]; > global_config -> sync_to_sb_lb > [[label="node_global_config_handler"]]; > + datapath_sync -> sync_to_sb_lb [[label="engine_noop_handler"]]; > northd -> sync_to_sb_lb [[label="sync_to_sb_lb_northd_handler"]]; > SB_load_balancer -> sync_to_sb_lb > [[label="sync_to_sb_lb_sb_load_balancer"]]; > SB_logical_dp_group -> sync_to_sb_lb [[label=""]]; > @@ -185,6 +186,7 @@ digraph "Incremental-Processing-Engine" { > group_ecmp_route -> lflow > [[label="lflow_group_ecmp_route_change_handler"]]; > global_config -> lflow [[label="node_global_config_handler"]]; > sampling_app -> lflow [[label=""]]; > + datapath_sync -> lflow [[label="engine_noop_handler"]]; > northd -> lflow [[label="lflow_northd_handler"]]; > port_group -> lflow [[label="engine_noop_handler"]]; > lr_stateful -> lflow [[label="lflow_lr_stateful_handler"]]; > -- > 2.51.1 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > With the potential sparse_array changes and nit accounted for: Acked-by: Ales Musil <[email protected]> Thanks, Ales _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
