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. 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); 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
