On Tue, Dec 16, 2025 at 7:44 PM Mark Michelson via dev < [email protected]> wrote:
> Prior to this commit, when en-datapath-sync would run, it would combine > all synced datapaths into a single large hmap. Type-specific synced > datapath handlers would need to go through this hmap and filter out the > relevant ones by type. > > This commit alters things by making en-datapath-sync sort the synced > datapaths into type-specific buckets. This then allows downstream engine > nodes to only look at the synced datapaths corresponding to their type. > > Signed-off-by: Mark Michelson <[email protected]> > --- > northd/datapath-sync.h | 6 -- > northd/en-datapath-logical-router.c | 23 ++--- > northd/en-datapath-logical-switch.c | 23 ++--- > northd/en-datapath-sync.c | 148 ++++++++++++++++++---------- > northd/en-datapath-sync.h | 8 ++ > 5 files changed, 118 insertions(+), 90 deletions(-) > > diff --git a/northd/datapath-sync.h b/northd/datapath-sync.h > index f54b79fab..301b3388d 100644 > --- a/northd/datapath-sync.h > +++ b/northd/datapath-sync.h > @@ -94,16 +94,10 @@ struct ovn_synced_datapath { > > struct ovn_synced_datapaths { > struct hmap synced_dps; > - struct hmap dp_tnlids; > > struct hmapx new; > struct hmapx updated; > struct hmapx deleted; > - > - /* Cache the vxlan mode setting. This is an easy way for us to detect > if > - * the global configuration resulted in a change to this value. > - */ > - bool vxlan_mode; > }; > > struct ovn_unsynced_datapath *ovn_unsynced_datapath_alloc( > diff --git a/northd/en-datapath-logical-router.c > b/northd/en-datapath-logical-router.c > index a4b5e2383..ae44ddaf5 100644 > --- a/northd/en-datapath-logical-router.c > +++ b/northd/en-datapath-logical-router.c > @@ -24,6 +24,7 @@ > #include "aging.h" > #include "datapath-sync.h" > #include "en-datapath-logical-router.h" > +#include "en-datapath-sync.h" > #include "ovn-util.h" > > VLOG_DEFINE_THIS_MODULE(en_datapath_logical_router); > @@ -308,8 +309,9 @@ synced_logical_router_alloc(const struct > ovn_synced_datapath *sdp) > enum engine_node_state > en_datapath_synced_logical_router_run(struct engine_node *node , void > *data) > { > - const struct ovn_synced_datapaths *dps = > + const struct all_synced_datapaths *all_dps = > engine_get_input_data("datapath_sync", node); > + const struct ovn_synced_datapaths *dps = > &all_dps->synced_dps[DP_ROUTER]; > struct ovn_synced_logical_router_map *router_map = data; > > synced_logical_router_map_destroy(router_map); > @@ -317,9 +319,6 @@ en_datapath_synced_logical_router_run(struct > engine_node *node , void *data) > > struct ovn_synced_datapath *sdp; > HMAP_FOR_EACH (sdp, hmap_node, &dps->synced_dps) { > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) { > - continue; > - } > struct ovn_synced_logical_router *lr = > synced_logical_router_alloc(sdp); > hmap_insert(&router_map->synced_routers, &lr->hmap_node, > @@ -349,13 +348,12 @@ enum engine_input_handler_result > en_datapath_synced_logical_router_datapath_sync_handler( > struct engine_node *node, void *data) > { > - const struct ovn_synced_datapaths *dps = > + const struct all_synced_datapaths *all_dps = > engine_get_input_data("datapath_sync", node); > + const struct ovn_synced_datapaths *dps = > &all_dps->synced_dps[DP_ROUTER]; > struct ovn_synced_logical_router_map *router_map = data; > > - if (hmapx_is_empty(&dps->deleted) && > - hmapx_is_empty(&dps->new) && > - hmapx_is_empty(&dps->updated)) { > + if (!all_dps->has_tracked_data) { > return EN_UNHANDLED; > } > > @@ -364,9 +362,6 @@ > en_datapath_synced_logical_router_datapath_sync_handler( > struct ovn_synced_logical_router *lr; > HMAPX_FOR_EACH (hmapx_node, &dps->new) { > sdp = hmapx_node->data; > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) { > - continue; > - } > lr = synced_logical_router_alloc(sdp); > hmap_insert(&router_map->synced_routers, &lr->hmap_node, > uuid_hash(&lr->nb->header_.uuid)); > @@ -375,9 +370,6 @@ > en_datapath_synced_logical_router_datapath_sync_handler( > > HMAPX_FOR_EACH (hmapx_node, &dps->deleted) { > sdp = hmapx_node->data; > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) { > - continue; > - } > lr = ovn_synced_logical_router_find(router_map, > &sdp->nb_row->uuid); > if (!lr) { > return EN_UNHANDLED; > @@ -388,9 +380,6 @@ > en_datapath_synced_logical_router_datapath_sync_handler( > > HMAPX_FOR_EACH (hmapx_node, &dps->updated) { > sdp = hmapx_node->data; > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) { > - continue; > - } > lr = ovn_synced_logical_router_find(router_map, > &sdp->nb_row->uuid); > if (!lr) { > return EN_UNHANDLED; > diff --git a/northd/en-datapath-logical-switch.c > b/northd/en-datapath-logical-switch.c > index 71b16ffe0..0c8aaeba3 100644 > --- a/northd/en-datapath-logical-switch.c > +++ b/northd/en-datapath-logical-switch.c > @@ -24,6 +24,7 @@ > #include "ovn-nb-idl.h" > #include "datapath-sync.h" > #include "en-datapath-logical-switch.h" > +#include "en-datapath-sync.h" > #include "en-global-config.h" > #include "ovn-util.h" > > @@ -299,8 +300,9 @@ synced_logical_switch_alloc(const struct > ovn_synced_datapath *sdp) > enum engine_node_state > en_datapath_synced_logical_switch_run(struct engine_node *node , void > *data) > { > - const struct ovn_synced_datapaths *dps = > + const struct all_synced_datapaths *all_dps = > engine_get_input_data("datapath_sync", node); > + const struct ovn_synced_datapaths *dps = > &all_dps->synced_dps[DP_SWITCH]; > struct ovn_synced_logical_switch_map *switch_map = data; > > synced_logical_switch_map_destroy(switch_map); > @@ -308,9 +310,6 @@ en_datapath_synced_logical_switch_run(struct > engine_node *node , void *data) > > struct ovn_synced_datapath *sdp; > HMAP_FOR_EACH (sdp, hmap_node, &dps->synced_dps) { > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) { > - continue; > - } > struct ovn_synced_logical_switch *lsw = > synced_logical_switch_alloc(sdp); > hmap_insert(&switch_map->synced_switches, &lsw->hmap_node, > @@ -341,13 +340,12 @@ enum engine_input_handler_result > en_datapath_synced_logical_switch_datapath_sync_handler( > struct engine_node *node, void *data) > { > - const struct ovn_synced_datapaths *dps = > + const struct all_synced_datapaths *all_dps = > engine_get_input_data("datapath_sync", node); > + const struct ovn_synced_datapaths *dps = > &all_dps->synced_dps[DP_SWITCH]; > struct ovn_synced_logical_switch_map *switch_map = data; > > - if (hmapx_is_empty(&dps->deleted) && > - hmapx_is_empty(&dps->new) && > - hmapx_is_empty(&dps->updated)) { > + if (!all_dps->has_tracked_data) { > return EN_UNHANDLED; > } > > @@ -356,9 +354,6 @@ > en_datapath_synced_logical_switch_datapath_sync_handler( > struct ovn_synced_logical_switch *lsw; > HMAPX_FOR_EACH (hmapx_node, &dps->new) { > sdp = hmapx_node->data; > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) { > - continue; > - } > lsw = synced_logical_switch_alloc(sdp); > hmap_insert(&switch_map->synced_switches, &lsw->hmap_node, > uuid_hash(&lsw->nb->header_.uuid)); > @@ -367,9 +362,6 @@ > en_datapath_synced_logical_switch_datapath_sync_handler( > > HMAPX_FOR_EACH (hmapx_node, &dps->deleted) { > sdp = hmapx_node->data; > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) { > - continue; > - } > lsw = ovn_synced_logical_switch_find(switch_map, > &sdp->nb_row->uuid); > if (!lsw) { > return EN_UNHANDLED; > @@ -380,9 +372,6 @@ > en_datapath_synced_logical_switch_datapath_sync_handler( > > HMAPX_FOR_EACH (hmapx_node, &dps->updated) { > sdp = hmapx_node->data; > - if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) { > - continue; > - } > lsw = ovn_synced_logical_switch_find(switch_map, > &sdp->nb_row->uuid); > if (!lsw) { > return EN_UNHANDLED; > diff --git a/northd/en-datapath-sync.c b/northd/en-datapath-sync.c > index 40ff6b027..74a5c587c 100644 > --- a/northd/en-datapath-sync.c > +++ b/northd/en-datapath-sync.c > @@ -31,17 +31,23 @@ void * > en_datapath_sync_init(struct engine_node *node OVS_UNUSED, > struct engine_arg *args OVS_UNUSED) > { > - struct ovn_synced_datapaths *synced_datapaths > - = xmalloc(sizeof *synced_datapaths); > - *synced_datapaths = (struct ovn_synced_datapaths) { > - .synced_dps = HMAP_INITIALIZER(&synced_datapaths->synced_dps), > - .dp_tnlids = HMAP_INITIALIZER(&synced_datapaths->dp_tnlids), > - .new = HMAPX_INITIALIZER(&synced_datapaths->new), > - .deleted = HMAPX_INITIALIZER(&synced_datapaths->deleted), > - .updated = HMAPX_INITIALIZER(&synced_datapaths->updated), > + struct all_synced_datapaths *all_dps; > + all_dps = xmalloc(sizeof *all_dps); > + *all_dps = (struct all_synced_datapaths) { > + .dp_tnlids = HMAP_INITIALIZER(&all_dps->dp_tnlids), > }; > + for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) { > + struct ovn_synced_datapaths *sdps = &all_dps->synced_dps[i]; > + *sdps = (struct ovn_synced_datapaths) { > + .synced_dps = HMAP_INITIALIZER(&sdps->synced_dps), > + .new = HMAPX_INITIALIZER(&sdps->new), > + .deleted = HMAPX_INITIALIZER(&sdps->deleted), > + .updated = HMAPX_INITIALIZER(&sdps->updated), > + }; > + } > + > > - return synced_datapaths; > + return all_dps; > } > > static struct ovn_unsynced_datapath * > @@ -120,6 +126,7 @@ struct candidate_sdp { > struct ovn_synced_datapath *sdp; > uint32_t requested_tunnel_key; > uint32_t existing_tunnel_key; > + enum ovn_datapath_type dp_type; > bool tunnel_key_assigned; > }; > > @@ -162,15 +169,19 @@ clear_tracked_data(struct ovn_synced_datapaths > *synced_datapaths) > } > > static void > -reset_synced_datapaths(struct ovn_synced_datapaths *synced_datapaths) > +reset_synced_datapaths(struct all_synced_datapaths *all_dps) > { > - struct ovn_synced_datapath *sdp; > - HMAP_FOR_EACH_POP (sdp, hmap_node, &synced_datapaths->synced_dps) { > - free(sdp); > + for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) { > + struct ovn_synced_datapaths *synced_datapaths = > + &all_dps->synced_dps[i]; > + struct ovn_synced_datapath *sdp; > + HMAP_FOR_EACH_POP (sdp, hmap_node, &synced_datapaths->synced_dps) > { > + free(sdp); > + } > + clear_tracked_data(synced_datapaths); > } > - ovn_destroy_tnlids(&synced_datapaths->dp_tnlids); > - clear_tracked_data(synced_datapaths); > - hmap_init(&synced_datapaths->dp_tnlids); > + ovn_destroy_tnlids(&all_dps->dp_tnlids); > + hmap_init(&all_dps->dp_tnlids); > } > > static void > @@ -200,10 +211,19 @@ create_synced_datapath_candidates_from_sb( > continue; > } > > + enum ovn_datapath_type dp_type = > + ovn_datapath_type_from_string(datapath_get_nb_type(sb_dp)); > + > + if (dp_type >= DP_MAX) { > + sbrec_datapath_binding_delete(sb_dp); > + continue; > + } > + > struct candidate_sdp candidate = { > .sdp = synced_datapath_alloc(udp, sb_dp, false), > .requested_tunnel_key = udp->requested_tunnel_key, > .existing_tunnel_key = sb_dp->tunnel_key, > + .dp_type = dp_type, > }; > synced_datapath_set_sb_fields(sb_dp, udp); > vector_push(candidate_sdps, &candidate); > @@ -231,6 +251,7 @@ create_synced_datapath_candidates_from_nb( > .sdp = synced_datapath_alloc(udp, sb_dp, true), > .requested_tunnel_key = udp->requested_tunnel_key, > .existing_tunnel_key = sb_dp->tunnel_key, > + .dp_type = i, > }; > synced_datapath_set_sb_fields(sb_dp, udp); > vector_push(candidate_sdps, &candidate); > @@ -240,14 +261,14 @@ create_synced_datapath_candidates_from_nb( > > static void > assign_requested_tunnel_keys(struct vector *candidate_sdps, > - struct ovn_synced_datapaths > *synced_datapaths) > + struct all_synced_datapaths *all_dps) > { > struct candidate_sdp *candidate; > VECTOR_FOR_EACH_PTR (candidate_sdps, candidate) { > if (!candidate->requested_tunnel_key) { > continue; > } > - if (!ovn_add_tnlid(&synced_datapaths->dp_tnlids, > + if (!ovn_add_tnlid(&all_dps->dp_tnlids, > candidate->requested_tunnel_key)) { > static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > VLOG_WARN_RL(&rl, "Logical datapath "UUID_FMT" requests same " > @@ -258,7 +279,8 @@ assign_requested_tunnel_keys(struct vector > *candidate_sdps, > } > sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp, > > candidate->requested_tunnel_key); > - hmap_insert(&synced_datapaths->synced_dps, > &candidate->sdp->hmap_node, > + hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps, > + &candidate->sdp->hmap_node, > uuid_hash(candidate->sdp->sb_dp->nb_uuid)); > candidate->tunnel_key_assigned = true; > } > @@ -266,7 +288,7 @@ assign_requested_tunnel_keys(struct vector > *candidate_sdps, > > static void > assign_existing_tunnel_keys(struct vector *candidate_sdps, > - struct ovn_synced_datapaths *synced_datapaths) > + struct all_synced_datapaths *all_dps) > { > struct candidate_sdp *candidate; > VECTOR_FOR_EACH_PTR (candidate_sdps, candidate) { > @@ -277,9 +299,9 @@ assign_existing_tunnel_keys(struct vector > *candidate_sdps, > /* Existing southbound DP. If this key is available, > * reuse it. > */ > - if (ovn_add_tnlid(&synced_datapaths->dp_tnlids, > + if (ovn_add_tnlid(&all_dps->dp_tnlids, > candidate->existing_tunnel_key)) { > - hmap_insert(&synced_datapaths->synced_dps, > + > hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps, > &candidate->sdp->hmap_node, > uuid_hash(candidate->sdp->sb_dp->nb_uuid)); > candidate->tunnel_key_assigned = true; > @@ -290,7 +312,7 @@ assign_existing_tunnel_keys(struct vector > *candidate_sdps, > static void > allocate_tunnel_keys(struct vector *candidate_sdps, > uint32_t max_dp_tunnel_id, > - struct ovn_synced_datapaths *synced_datapaths) > + struct all_synced_datapaths *all_dps) > { > uint32_t hint = 0; > struct candidate_sdp *candidate; > @@ -299,7 +321,7 @@ allocate_tunnel_keys(struct vector *candidate_sdps, > continue; > } > uint32_t tunnel_key = > - ovn_allocate_tnlid(&synced_datapaths->dp_tnlids, "datapath", > + ovn_allocate_tnlid(&all_dps->dp_tnlids, "datapath", > OVN_MIN_DP_KEY_LOCAL, > max_dp_tunnel_id, &hint); > if (!tunnel_key) { > @@ -307,7 +329,8 @@ allocate_tunnel_keys(struct vector *candidate_sdps, > } > sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp, > tunnel_key); > - hmap_insert(&synced_datapaths->synced_dps, > &candidate->sdp->hmap_node, > + hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps, > + &candidate->sdp->hmap_node, > uuid_hash(candidate->sdp->sb_dp->nb_uuid)); > candidate->tunnel_key_assigned = true; > } > @@ -330,10 +353,13 @@ static enum engine_input_handler_result > datapath_sync_unsynced_datapath_handler( > const struct ovn_unsynced_datapath_map *map, > const struct ed_type_global_config *global_config, > - struct ovsdb_idl_txn *ovnsb_idl_txn, void *data) > + struct ovsdb_idl_txn *ovnsb_idl_txn, > + enum ovn_datapath_type dp_type, void *data) > { > enum engine_input_handler_result ret = EN_HANDLED_UNCHANGED; > - struct ovn_synced_datapaths *synced_datapaths = data; > + struct all_synced_datapaths *all_dps = data; > + struct ovn_synced_datapaths *synced_datapaths = > + &all_dps->synced_dps[dp_type]; > struct ovn_unsynced_datapath *udp; > struct ovn_synced_datapath *sdp; > > @@ -352,7 +378,7 @@ datapath_sync_unsynced_datapath_handler( > } > hmap_remove(&synced_datapaths->synced_dps, &sdp->hmap_node); > hmapx_add(&synced_datapaths->deleted, sdp); > - ovn_free_tnlid(&synced_datapaths->dp_tnlids, > + ovn_free_tnlid(&all_dps->dp_tnlids, > sdp->sb_dp->tunnel_key); > sbrec_datapath_binding_delete(sdp->sb_dp); > ret = EN_HANDLED_UPDATED; > @@ -368,12 +394,12 @@ datapath_sync_unsynced_datapath_handler( > > if (udp->requested_tunnel_key) { > tunnel_key = udp->requested_tunnel_key; > - if (!ovn_add_tnlid(&synced_datapaths->dp_tnlids, tunnel_key)) > { > + if (!ovn_add_tnlid(&all_dps->dp_tnlids, tunnel_key)) { > return EN_UNHANDLED; > } > } else { > uint32_t hint = 0; > - tunnel_key = ovn_allocate_tnlid(&synced_datapaths->dp_tnlids, > + tunnel_key = ovn_allocate_tnlid(&all_dps->dp_tnlids, > "datapath", > OVN_MIN_DP_KEY_LOCAL, > > global_config->max_dp_tunnel_id, > &hint); > @@ -401,9 +427,8 @@ datapath_sync_unsynced_datapath_handler( > } > if (udp->requested_tunnel_key && > udp->requested_tunnel_key != sdp->sb_dp->tunnel_key) { > - ovn_free_tnlid(&synced_datapaths->dp_tnlids, > - sdp->sb_dp->tunnel_key); > - if (!ovn_add_tnlid(&synced_datapaths->dp_tnlids, > + ovn_free_tnlid(&all_dps->dp_tnlids, sdp->sb_dp->tunnel_key); > + if (!ovn_add_tnlid(&all_dps->dp_tnlids, > udp->requested_tunnel_key)) { > return EN_UNHANDLED; > } > @@ -418,6 +443,7 @@ datapath_sync_unsynced_datapath_handler( > ret = EN_HANDLED_UPDATED; > } > > + all_dps->has_tracked_data = true; > return ret; > } > > @@ -432,6 +458,7 @@ datapath_sync_logical_switch_handler(struct > engine_node *node, void *data) > > return datapath_sync_unsynced_datapath_handler(map, global_config, > eng_ctx->ovnsb_idl_txn, > + DP_SWITCH, > data); > } > > @@ -446,6 +473,7 @@ datapath_sync_logical_router_handler(struct > engine_node *node, void *data) > > return datapath_sync_unsynced_datapath_handler(map, global_config, > eng_ctx->ovnsb_idl_txn, > + DP_ROUTER, > data); > } > > @@ -454,9 +482,9 @@ datapath_sync_global_config_handler(struct engine_node > *node, void *data) > { > const struct ed_type_global_config *global_config = > engine_get_input_data("global_config", node); > - struct ovn_synced_datapaths *synced_datapaths = data; > + struct all_synced_datapaths *all_dps = data; > > - if (synced_datapaths->vxlan_mode != > + if (all_dps->vxlan_mode != > global_config->vxlan_mode) { > /* If VXLAN mode changes, then the range of datapath tunnel IDs > * has completely been upended and we need to recompute. > @@ -473,12 +501,21 @@ datapath_sync_sb_datapath_binding(struct engine_node > *node, void *data) > const struct sbrec_datapath_binding_table *sb_dp_table = > EN_OVSDB_GET(engine_get_input("SB_datapath_binding", node)); > enum engine_input_handler_result ret = EN_HANDLED_UNCHANGED; > - struct ovn_synced_datapaths *synced_datapaths = data; > + struct all_synced_datapaths *all_dps = data; > > const struct sbrec_datapath_binding *sb_dp; > SBREC_DATAPATH_BINDING_TABLE_FOR_EACH_TRACKED (sb_dp, sb_dp_table) { > + enum ovn_datapath_type dp_type = > + ovn_datapath_type_from_string(datapath_get_nb_type(sb_dp)); > + if (dp_type >= DP_MAX) { > + /* We have an unrecognized datapath type in the SB DB. How? > + * Gotta recompute and get rid of it. > + */ > + return EN_UNHANDLED; > + } > struct ovn_synced_datapath *sdp = > - find_synced_datapath_from_sb(&synced_datapaths->synced_dps, > sb_dp); > + find_synced_datapath_from_sb( > + &all_dps->synced_dps[dp_type].synced_dps, sb_dp); > if (sbrec_datapath_binding_is_deleted(sb_dp)) { > if (sdp) { > /* The SB datapath binding was deleted, but we still have > a > @@ -530,9 +567,12 @@ datapath_sync_sb_datapath_binding(struct engine_node > *node, void *data) > void > en_datapath_sync_clear_tracked_data(void *data) > { > - struct ovn_synced_datapaths *synced_datapaths = data; > + struct all_synced_datapaths *all_dps = data; > > - clear_tracked_data(synced_datapaths); > + for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) { > + clear_tracked_data(&all_dps->synced_dps[i]); > + } > + all_dps->has_tracked_data = false; > } > > enum engine_node_state > @@ -548,7 +588,7 @@ en_datapath_sync_run(struct engine_node *node , void > *data) > engine_get_input_data("datapath_logical_router", node); > > const struct ovn_unsynced_datapath_map *input_maps[DP_MAX]; > - struct ovn_synced_datapaths *synced_datapaths = data; > + struct all_synced_datapaths *all_synced_datapaths = data; > > input_maps[unsynced_ls_map->dp_type] = unsynced_ls_map; > input_maps[unsynced_lr_map->dp_type] = unsynced_lr_map; > @@ -559,9 +599,9 @@ en_datapath_sync_run(struct engine_node *node , void > *data) > num_datapaths += hmap_count(&input_maps[i]->dps); > } > > - reset_synced_datapaths(synced_datapaths); > + reset_synced_datapaths(all_synced_datapaths); > > - synced_datapaths->vxlan_mode = global_config->vxlan_mode; > + all_synced_datapaths->vxlan_mode = global_config->vxlan_mode; > > struct uuidset visited = UUIDSET_INITIALIZER(&visited); > struct vector candidate_sdps = > @@ -575,10 +615,10 @@ en_datapath_sync_run(struct engine_node *node , void > *data) > &candidate_sdps); > uuidset_destroy(&visited); > > - assign_requested_tunnel_keys(&candidate_sdps, synced_datapaths); > - assign_existing_tunnel_keys(&candidate_sdps, synced_datapaths); > + assign_requested_tunnel_keys(&candidate_sdps, all_synced_datapaths); > + assign_existing_tunnel_keys(&candidate_sdps, all_synced_datapaths); > allocate_tunnel_keys(&candidate_sdps, global_config->max_dp_tunnel_id, > - synced_datapaths); > + all_synced_datapaths); > > delete_unassigned_candidates(&candidate_sdps); > vector_destroy(&candidate_sdps); > @@ -586,11 +626,9 @@ en_datapath_sync_run(struct engine_node *node , void > *data) > return EN_UPDATED; > } > > -void en_datapath_sync_cleanup(void *data) > +static void > +synced_datapaths_cleanup(struct ovn_synced_datapaths *synced_datapaths) > { > - struct ovn_synced_datapaths *synced_datapaths = data; > - struct ovn_synced_datapath *sdp; > - > hmapx_destroy(&synced_datapaths->new); > hmapx_destroy(&synced_datapaths->updated); > struct hmapx_node *node; > @@ -599,9 +637,19 @@ void en_datapath_sync_cleanup(void *data) > } > hmapx_destroy(&synced_datapaths->deleted); > > + struct ovn_synced_datapath *sdp; > HMAP_FOR_EACH_POP (sdp, hmap_node, &synced_datapaths->synced_dps) { > free(sdp); > } > hmap_destroy(&synced_datapaths->synced_dps); > - ovn_destroy_tnlids(&synced_datapaths->dp_tnlids); > +} > + > +void en_datapath_sync_cleanup(void *data) > +{ > + struct all_synced_datapaths *all_dps = data; > + > + for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) { > + synced_datapaths_cleanup(&all_dps->synced_dps[i]); > + } > + ovn_destroy_tnlids(&all_dps->dp_tnlids); > } > diff --git a/northd/en-datapath-sync.h b/northd/en-datapath-sync.h > index 0f7a85d1d..39daee505 100644 > --- a/northd/en-datapath-sync.h > +++ b/northd/en-datapath-sync.h > @@ -18,6 +18,14 @@ > #define EN_DATAPATH_SYNC_H > > #include "inc-proc-eng.h" > +#include "datapath-sync.h" > + > +struct all_synced_datapaths { > + struct ovn_synced_datapaths synced_dps[DP_MAX]; > + struct hmap dp_tnlids; > + bool vxlan_mode; > + bool has_tracked_data; > +}; > > void *en_datapath_sync_init(struct engine_node *, > struct engine_arg *); > -- > 2.51.1 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > Looks good to me, thanks. Acked-by: Ales Musil <[email protected]> It also seems like CI had some infra issues, let's try it again: Recheck-request: github-robot-_Build_and_Test _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
