On Thu, Jan 8, 2026 at 9:47 PM Mark Michelson via dev < [email protected]> wrote:
> Signed-off-by: Mark Michelson <[email protected]> > --- > northd/datapath-sync.h | 4 ++++ > northd/en-datapath-sync.c | 33 ++++++++++++++++++++++----------- > 2 files changed, 26 insertions(+), 11 deletions(-) > > diff --git a/northd/datapath-sync.h b/northd/datapath-sync.h > index 301b3388d..49eb008ed 100644 > --- a/northd/datapath-sync.h > +++ b/northd/datapath-sync.h > @@ -19,6 +19,7 @@ > #include "openvswitch/hmap.h" > #include "smap.h" > #include "hmapx.h" > +#include "sparse-array.h" > > /* Datapath syncing API. This file consists of utility functions > * that can be used when syncing northbound datapath types (e.g. > @@ -75,6 +76,8 @@ struct ovn_synced_datapath { > struct hmap_node hmap_node; > const struct ovsdb_idl_row *nb_row; > const struct sbrec_datapath_binding *sb_dp; > + size_t index; > + const struct ovn_synced_datapaths *dps; > /* This boolean indicates if the synced datapath > * has a transient sb_dp pointer. If "true", then > * it means the sb_dp field is the return value of > @@ -94,6 +97,7 @@ struct ovn_synced_datapath { > > struct ovn_synced_datapaths { > struct hmap synced_dps; > + struct sparse_array dps_array; > > struct hmapx new; > struct hmapx updated; > diff --git a/northd/en-datapath-sync.c b/northd/en-datapath-sync.c > index 74a5c587c..a0faa85ab 100644 > --- a/northd/en-datapath-sync.c > +++ b/northd/en-datapath-sync.c > @@ -44,6 +44,7 @@ en_datapath_sync_init(struct engine_node *node > OVS_UNUSED, > .deleted = HMAPX_INITIALIZER(&sdps->deleted), > .updated = HMAPX_INITIALIZER(&sdps->updated), > }; > + sparse_array_init(&sdps->dps_array, 0); > } > > > @@ -179,6 +180,8 @@ reset_synced_datapaths(struct all_synced_datapaths > *all_dps) > free(sdp); > } > clear_tracked_data(synced_datapaths); > + sparse_array_destroy(&synced_datapaths->dps_array); > + sparse_array_init(&synced_datapaths->dps_array, 0); > } > ovn_destroy_tnlids(&all_dps->dp_tnlids); > hmap_init(&all_dps->dp_tnlids); > @@ -259,6 +262,16 @@ create_synced_datapath_candidates_from_nb( > } > } > > +static void > +ovn_synced_datapath_add(struct ovn_synced_datapaths *sdps, > + struct ovn_synced_datapath *sdp) > +{ > + hmap_insert(&sdps->synced_dps, &sdp->hmap_node, > + uuid_hash(sdp->sb_dp->nb_uuid)); > + sdp->index = sparse_array_add(&sdps->dps_array, sdp); > + sdp->dps = sdps; > +} > + > static void > assign_requested_tunnel_keys(struct vector *candidate_sdps, > struct all_synced_datapaths *all_dps) > @@ -279,9 +292,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(&all_dps->synced_dps[candidate->dp_type].synced_dps, > - &candidate->sdp->hmap_node, > - uuid_hash(candidate->sdp->sb_dp->nb_uuid)); > + ovn_synced_datapath_add(&all_dps->synced_dps[candidate->dp_type], > + candidate->sdp); > candidate->tunnel_key_assigned = true; > } > } > @@ -301,9 +313,8 @@ assign_existing_tunnel_keys(struct vector > *candidate_sdps, > */ > if (ovn_add_tnlid(&all_dps->dp_tnlids, > candidate->existing_tunnel_key)) { > - > hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps, > - &candidate->sdp->hmap_node, > - uuid_hash(candidate->sdp->sb_dp->nb_uuid)); > + > ovn_synced_datapath_add(&all_dps->synced_dps[candidate->dp_type], > + candidate->sdp); > candidate->tunnel_key_assigned = true; > } > } > @@ -329,9 +340,8 @@ allocate_tunnel_keys(struct vector *candidate_sdps, > } > sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp, > tunnel_key); > - hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps, > - &candidate->sdp->hmap_node, > - uuid_hash(candidate->sdp->sb_dp->nb_uuid)); > + ovn_synced_datapath_add(&all_dps->synced_dps[candidate->dp_type], > + candidate->sdp); > candidate->tunnel_key_assigned = true; > } > } > @@ -377,6 +387,7 @@ datapath_sync_unsynced_datapath_handler( > return EN_UNHANDLED; > } > hmap_remove(&synced_datapaths->synced_dps, &sdp->hmap_node); > + sparse_array_remove(&synced_datapaths->dps_array, sdp->index); > hmapx_add(&synced_datapaths->deleted, sdp); > ovn_free_tnlid(&all_dps->dp_tnlids, > sdp->sb_dp->tunnel_key); > @@ -413,8 +424,7 @@ datapath_sync_unsynced_datapath_handler( > sbrec_datapath_binding_set_tunnel_key(sb_dp, tunnel_key); > sdp = synced_datapath_alloc(udp, sb_dp, true); > synced_datapath_set_sb_fields(sb_dp, udp); > - hmap_insert(&synced_datapaths->synced_dps, &sdp->hmap_node, > - uuid_hash(&udp->nb_row->uuid)); > + ovn_synced_datapath_add(synced_datapaths, sdp); > hmapx_add(&synced_datapaths->new, sdp); > ret = EN_HANDLED_UPDATED; > } > @@ -642,6 +652,7 @@ synced_datapaths_cleanup(struct ovn_synced_datapaths > *synced_datapaths) > free(sdp); > } > hmap_destroy(&synced_datapaths->synced_dps); > + sparse_array_destroy(&synced_datapaths->dps_array); > } > > void en_datapath_sync_cleanup(void *data) > -- > 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]> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
