The ovn_datapaths structure maintains an array of datapaths, allowing for bitmaps to be used to indicate the relevant datapaths associated with an entity, such as a logical flow.
Logical flow syncing is attempting to rid itself of dependencies on ovn_datapaths, but the logical flow creation hinges on the datapath indices. This commit addresses the issue by introducing a type-agnostic ovn_datapath_binding_hashvec structure that can be used to store southbound Datapath_Bindings in both a hashmap and an array. This allows for us to correlate a southbound Datapath_Binding with a specific index into its corresponding vector. The ovn_datapaths array is created based on this vector, meaning that an ovn_datapath's index corresponds to the same southbound Datapath_Binding's ovn_datapath_binding index. In order to maintain consistency of indices, this commit also changes synced datapath bindings to be a vector instead of a list, and sorts the vector with each run. This ensures that synced datapaths will contain the same indices as long as new datapaths are not added or removed from the database. If datapaths are added or removed, then northd has to recompute, meaning that the ovn_datapaths will recreate their arrays and indices. Signed-off-by: Mark Michelson <mmich...@redhat.com> --- northd/datapath_sync.c | 52 ++++++++++++++++ northd/datapath_sync.h | 33 ++++++++-- northd/en-datapath-logical-router.c | 10 ++- northd/en-datapath-logical-router.h | 7 ++- northd/en-datapath-logical-switch.c | 10 ++- northd/en-datapath-logical-switch.h | 5 +- northd/en-datapath-sync.c | 36 ++++++++--- northd/en-lflow.c | 28 ++++----- northd/en-northd.c | 5 +- northd/en-port-binding-chassisredirect.c | 8 +-- northd/en-port-binding-logical-router-port.c | 2 +- northd/en-port-binding-logical-switch-port.c | 2 +- northd/en-port-binding-mirror.c | 4 +- northd/northd.c | 64 +++++++++----------- northd/northd.h | 2 +- 15 files changed, 180 insertions(+), 88 deletions(-) diff --git a/northd/datapath_sync.c b/northd/datapath_sync.c index 78e8cd8a1..94b953fe9 100644 --- a/northd/datapath_sync.c +++ b/northd/datapath_sync.c @@ -15,7 +15,9 @@ #include <config.h> +#include "ovn-sb-idl.h" #include "datapath_sync.h" +#include "uuid.h" static const char *ovn_datapath_strings [] = { [DP_SWITCH] = "logical-switch", @@ -84,3 +86,53 @@ ovn_unsynced_datapath_map_destroy(struct ovn_unsynced_datapath_map *map) } hmap_destroy(&map->dps); } + +void +ovn_datapath_binding_hashvec_init(struct ovn_datapath_binding_hashvec *hashvec) +{ + hmap_init(&hashvec->bindings_map); + hashvec->bindings_vec = + VECTOR_EMPTY_INITIALIZER(struct ovn_datapath_binding *); +} + +void +ovn_datapath_binding_hashvec_destroy( + struct ovn_datapath_binding_hashvec *hashvec) +{ + struct ovn_datapath_binding *binding; + HMAP_FOR_EACH_POP (binding, hmap_node, &hashvec->bindings_map) { + free(binding); + } + hmap_destroy(&hashvec->bindings_map); + vector_destroy(&hashvec->bindings_vec); +} + +const struct ovn_datapath_binding * +ovn_datapath_binding_hashvec_add( + struct ovn_datapath_binding_hashvec *hashvec, + const struct sbrec_datapath_binding *sb) +{ + struct ovn_datapath_binding *binding = xmalloc(sizeof *binding); + binding->sb = sb; + binding->index = vector_len(&hashvec->bindings_vec); + hmap_insert(&hashvec->bindings_map, &binding->hmap_node, + uuid_hash(&sb->header_.uuid)); + vector_push(&hashvec->bindings_vec, &binding); + return binding; +} + +const struct ovn_datapath_binding * +ovn_datapath_binding_find(const struct ovn_datapath_binding_hashvec *hashvec, + const struct sbrec_datapath_binding *sb) +{ + const struct ovn_datapath_binding *binding; + size_t hash = uuid_hash(&sb->header_.uuid); + HMAP_FOR_EACH_WITH_HASH (binding, hmap_node, hash, + &hashvec->bindings_map) { + if (uuid_equals(&binding->sb->header_.uuid, &sb->header_.uuid)) { + return binding; + } + } + + return NULL; +} diff --git a/northd/datapath_sync.h b/northd/datapath_sync.h index efe4bb3e8..0feefae33 100644 --- a/northd/datapath_sync.h +++ b/northd/datapath_sync.h @@ -17,7 +17,7 @@ #define DATAPATH_SYNC_H 1 #include "openvswitch/hmap.h" -#include "openvswitch/list.h" +#include "vec.h" #include "smap.h" /* Datapath syncing API. This file consists of utility functions @@ -30,7 +30,8 @@ * 2. The en_datapath_sync node takes all of the maps in as input and * syncs them with southbound datapath bindings. This includes allocating * tunnel keys across all datapath types. The output of this node is - * ovn_synced_datapaths, which contains a list of all synced datapaths. + * ovn_synced_datapaths, which contains a sorted vector of all synced + * datapaths. * 3. A northbound type-aware node then takes the ovn_synced_datapaths, * and decodes the generic synced datapaths back into a type-specific * version (e.g. ovn_synced_logical_router). Later nodes can then consume @@ -66,13 +67,12 @@ struct ovn_unsynced_datapath_map { }; struct ovn_synced_datapath { - struct ovs_list list_node; const struct ovsdb_idl_row *nb_row; const struct sbrec_datapath_binding *sb_dp; }; struct ovn_synced_datapaths { - struct ovs_list synced_dps; + struct vector synced_dps; }; struct ovn_unsynced_datapath *ovn_unsynced_datapath_alloc( @@ -84,4 +84,29 @@ void ovn_unsynced_datapath_map_init(struct ovn_unsynced_datapath_map *map, enum ovn_datapath_type dp_type); void ovn_unsynced_datapath_map_destroy(struct ovn_unsynced_datapath_map *map); +struct ovn_datapath_binding { + struct hmap_node hmap_node; + const struct sbrec_datapath_binding *sb; + size_t index; +}; + +struct ovn_datapath_binding_hashvec { + struct hmap bindings_map; + struct vector bindings_vec; +}; + +void ovn_datapath_binding_hashvec_init( + struct ovn_datapath_binding_hashvec *hashvec); + +void ovn_datapath_binding_hashvec_destroy( + struct ovn_datapath_binding_hashvec *hashvec); + +const struct ovn_datapath_binding * +ovn_datapath_binding_hashvec_add( + struct ovn_datapath_binding_hashvec *hashvec, + const struct sbrec_datapath_binding *sb); + +const struct ovn_datapath_binding * +ovn_datapath_binding_find(const struct ovn_datapath_binding_hashvec *hashvec, + const struct sbrec_datapath_binding *sb); #endif /* DATAPATH_SYNC_H */ diff --git a/northd/en-datapath-logical-router.c b/northd/en-datapath-logical-router.c index b8ec7073e..9d6e145ab 100644 --- a/northd/en-datapath-logical-router.c +++ b/northd/en-datapath-logical-router.c @@ -117,6 +117,7 @@ synced_logical_router_map_init( struct ovn_synced_logical_router_map *router_map) { hmap_init(&router_map->synced_routers); + ovn_datapath_binding_hashvec_init(&router_map->datapaths); } static void @@ -128,6 +129,7 @@ synced_logical_router_map_destroy( free(lr); } hmap_destroy(&router_map->synced_routers); + ovn_datapath_binding_hashvec_destroy(&router_map->datapaths); } void * @@ -152,14 +154,15 @@ en_datapath_synced_logical_router_run(struct engine_node *node , void *data) synced_logical_router_map_init(router_map); struct ovn_synced_datapath *sdp; - LIST_FOR_EACH (sdp, list_node, &dps->synced_dps) { + VECTOR_FOR_EACH (&dps->synced_dps, sdp) { if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) { continue; } struct ovn_synced_logical_router *lr = xmalloc(sizeof *lr); lr->nb = CONTAINER_OF(sdp->nb_row, struct nbrec_logical_router, header_); - lr->sb = sdp->sb_dp; + lr->binding = ovn_datapath_binding_hashvec_add(&router_map->datapaths, + sdp->sb_dp); hmap_insert(&router_map->synced_routers, &lr->hmap_node, uuid_hash(&lr->nb->header_.uuid)); } @@ -179,7 +182,8 @@ ovn_synced_logical_router_find(const struct ovn_synced_logical_router_map *map, { uint32_t hash = uuid_hash(nb_uuid); const struct ovn_synced_logical_router *router; - HMAP_FOR_EACH_WITH_HASH (router, hmap_node, hash, &map->synced_routers) { + HMAP_FOR_EACH_WITH_HASH (router, hmap_node, hash, + &map->synced_routers) { if (uuid_equals(&router->nb->header_.uuid, nb_uuid)) { return router; } diff --git a/northd/en-datapath-logical-router.h b/northd/en-datapath-logical-router.h index eb0923f9c..66d4f08db 100644 --- a/northd/en-datapath-logical-router.h +++ b/northd/en-datapath-logical-router.h @@ -19,6 +19,7 @@ #include "lib/inc-proc-eng.h" #include "openvswitch/hmap.h" +#include "datapath_sync.h" void *en_datapath_logical_router_init(struct engine_node *, @@ -31,11 +32,13 @@ void en_datapath_logical_router_cleanup(void *data); struct ovn_synced_logical_router { struct hmap_node hmap_node; const struct nbrec_logical_router *nb; - const struct sbrec_datapath_binding *sb; + const struct ovn_datapath_binding *binding; }; struct ovn_synced_logical_router_map { + /* Contains struct ovn_synced_logical_router */ struct hmap synced_routers; + struct ovn_datapath_binding_hashvec datapaths; }; void *en_datapath_synced_logical_router_init(struct engine_node *, @@ -49,6 +52,6 @@ void en_datapath_synced_logical_router_cleanup(void *data); struct uuid; const struct ovn_synced_logical_router * ovn_synced_logical_router_find(const struct ovn_synced_logical_router_map *map, - const struct uuid *nb_uuid); + const struct uuid *nb_uuid); #endif /* EN_DATAPATH_LOGICAL_ROUTER_H */ diff --git a/northd/en-datapath-logical-switch.c b/northd/en-datapath-logical-switch.c index 6dd2adf3c..767f3c9ec 100644 --- a/northd/en-datapath-logical-switch.c +++ b/northd/en-datapath-logical-switch.c @@ -115,6 +115,7 @@ synced_logical_switch_map_init( struct ovn_synced_logical_switch_map *switch_map) { hmap_init(&switch_map->synced_switches); + ovn_datapath_binding_hashvec_init(&switch_map->datapaths); } static void @@ -126,6 +127,7 @@ synced_logical_switch_map_destroy( free(ls); } hmap_destroy(&switch_map->synced_switches); + ovn_datapath_binding_hashvec_destroy(&switch_map->datapaths); } void * @@ -150,14 +152,15 @@ en_datapath_synced_logical_switch_run(struct engine_node *node , void *data) synced_logical_switch_map_init(switch_map); struct ovn_synced_datapath *sdp; - LIST_FOR_EACH (sdp, list_node, &dps->synced_dps) { + VECTOR_FOR_EACH (&dps->synced_dps, sdp) { if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) { continue; } struct ovn_synced_logical_switch *lsw = xmalloc(sizeof *lsw); lsw->nb = CONTAINER_OF(sdp->nb_row, struct nbrec_logical_switch, header_); - lsw->sb = sdp->sb_dp; + lsw->binding = ovn_datapath_binding_hashvec_add(&switch_map->datapaths, + sdp->sb_dp); hmap_insert(&switch_map->synced_switches, &lsw->hmap_node, uuid_hash(&lsw->nb->header_.uuid)); } @@ -177,7 +180,8 @@ ovn_synced_logical_switch_find(const struct ovn_synced_logical_switch_map *map, { uint32_t hash = uuid_hash(nb_uuid); const struct ovn_synced_logical_switch *ls; - HMAP_FOR_EACH_WITH_HASH (ls, hmap_node, hash, &map->synced_switches) { + HMAP_FOR_EACH_WITH_HASH (ls, hmap_node, hash, + &map->synced_switches) { if (uuid_equals(&ls->nb->header_.uuid, nb_uuid)) { return ls; } diff --git a/northd/en-datapath-logical-switch.h b/northd/en-datapath-logical-switch.h index 3f00b9996..7023218a3 100644 --- a/northd/en-datapath-logical-switch.h +++ b/northd/en-datapath-logical-switch.h @@ -19,6 +19,7 @@ #include "lib/inc-proc-eng.h" #include "openvswitch/hmap.h" +#include "datapath_sync.h" void *en_datapath_logical_switch_init(struct engine_node *, @@ -31,11 +32,13 @@ void en_datapath_logical_switch_cleanup(void *data); struct ovn_synced_logical_switch { struct hmap_node hmap_node; const struct nbrec_logical_switch *nb; - const struct sbrec_datapath_binding *sb; + const struct ovn_datapath_binding *binding; }; struct ovn_synced_logical_switch_map { + /* Contains struct ovn_synced_logical_switch */ struct hmap synced_switches; + struct ovn_datapath_binding_hashvec datapaths; }; void *en_datapath_synced_logical_switch_init(struct engine_node *, diff --git a/northd/en-datapath-sync.c b/northd/en-datapath-sync.c index 09a19abf8..3ed016850 100644 --- a/northd/en-datapath-sync.c +++ b/northd/en-datapath-sync.c @@ -33,7 +33,8 @@ en_datapath_sync_init(struct engine_node *node OVS_UNUSED, { struct ovn_synced_datapaths *synced_datapaths = xmalloc(sizeof *synced_datapaths); - ovs_list_init(&synced_datapaths->synced_dps); + synced_datapaths->synced_dps = + VECTOR_EMPTY_INITIALIZER(struct ovn_synced_datapath *); return synced_datapaths; } @@ -97,10 +98,11 @@ static void reset_synced_datapaths(struct ovn_synced_datapaths *synced_datapaths) { struct ovn_synced_datapath *sdp; - LIST_FOR_EACH_POP (sdp, list_node, &synced_datapaths->synced_dps) { + VECTOR_FOR_EACH (&synced_datapaths->synced_dps, sdp) { free(sdp); } - ovs_list_init(&synced_datapaths->synced_dps); + /* vector_destroy both destroys and inits the vector */ + vector_destroy(&synced_datapaths->synced_dps); } static void @@ -186,9 +188,8 @@ assign_requested_tunnel_keys(struct vector *candidate_sdps, } sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp, candidate->requested_tunnel_key); - ovs_list_push_back(&synced_datapaths->synced_dps, - &candidate->sdp->list_node); candidate->tunnel_key_assigned = true; + vector_push(&synced_datapaths->synced_dps, &candidate->sdp); } } @@ -207,9 +208,8 @@ assign_existing_tunnel_keys(struct vector *candidate_sdps, * reuse it. */ if (ovn_add_tnlid(dp_tnlids, candidate->existing_tunnel_key)) { - ovs_list_push_back(&synced_datapaths->synced_dps, - &candidate->sdp->list_node); candidate->tunnel_key_assigned = true; + vector_push(&synced_datapaths->synced_dps, &candidate->sdp); } } } @@ -234,9 +234,8 @@ allocate_tunnel_keys(struct vector *candidate_sdps, } sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp, tunnel_key); - ovs_list_push_back(&synced_datapaths->synced_dps, - &candidate->sdp->list_node); candidate->tunnel_key_assigned = true; + vector_push(&synced_datapaths->synced_dps, &candidate->sdp); } } @@ -253,6 +252,17 @@ delete_unassigned_candidates(struct vector *candidate_sdps) } } +static int +synced_dp_cmp(const void *a_, const void *b_) +{ + const struct ovn_synced_datapath *const *a__ = a_; + const struct ovn_synced_datapath *const *b__ = b_; + const struct ovn_synced_datapath *a = *a__; + const struct ovn_synced_datapath *b = *b__; + + return uuid_compare_3way(&a->nb_row->uuid, &b->nb_row->uuid); +} + enum engine_node_state en_datapath_sync_run(struct engine_node *node , void *data) { @@ -303,6 +313,11 @@ en_datapath_sync_run(struct engine_node *node , void *data) ovn_destroy_tnlids(&dp_tnlids); + /* Sort the synced_datapaths. This ensures the order is consistent between + * runs when no new datapaths have been inserted or deleted. + */ + vector_qsort(&synced_datapaths->synced_dps, synced_dp_cmp); + return EN_UPDATED; } @@ -311,7 +326,8 @@ void en_datapath_sync_cleanup(void *data) struct ovn_synced_datapaths *synced_datapaths = data; struct ovn_synced_datapath *sdp; - LIST_FOR_EACH_POP (sdp, list_node, &synced_datapaths->synced_dps) { + VECTOR_FOR_EACH (&synced_datapaths->synced_dps, sdp) { free(sdp); } + vector_destroy(&synced_datapaths->synced_dps); } diff --git a/northd/en-lflow.c b/northd/en-lflow.c index 07d7c7882..e9363a2e4 100644 --- a/northd/en-lflow.c +++ b/northd/en-lflow.c @@ -31,6 +31,7 @@ #include "lflow-mgr.h" #include "en-datapath-logical-switch.h" #include "en-datapath-logical-router.h" +#include "datapath_sync.h" #include "lib/inc-proc-eng.h" #include "northd.h" @@ -314,25 +315,20 @@ datapath_is_valid(const struct sbrec_datapath_binding *dp, if (dp_type == DP_MAX) { return false; } - struct uuid nb_dp_key; - if (!smap_get_uuid(&dp->external_ids, "nb_uuid", &nb_dp_key)) { + const struct ovn_datapath_binding_hashvec *hashvec; + switch (dp_type) { + case DP_SWITCH: + hashvec = &synced_lses->datapaths; + break; + case DP_ROUTER: + hashvec = &synced_lrs->datapaths; + break; + case DP_MAX: + default: return false; } - if (dp_type == DP_SWITCH) { - if (ovn_synced_logical_switch_find(synced_lses, &nb_dp_key)) { - return true; - } else { - return false; - } - } else if (dp_type == DP_ROUTER) { - if (ovn_synced_logical_router_find(synced_lrs, &nb_dp_key)) { - return true; - } else { - return false; - } - } - return false; + return ovn_datapath_binding_find(hashvec, dp) != NULL; } static void diff --git a/northd/en-northd.c b/northd/en-northd.c index 15840e361..3a805106c 100644 --- a/northd/en-northd.c +++ b/northd/en-northd.c @@ -146,9 +146,8 @@ en_northd_run(struct engine_node *node, void *data) struct northd_input input_data; northd_destroy(data); - northd_init(data); - northd_get_input_data(node, &input_data); + northd_init(data, &input_data); COVERAGE_INC(northd_run); stopwatch_start(OVNNB_DB_RUN_STOPWATCH_NAME, time_msec()); @@ -433,7 +432,7 @@ void { struct northd_data *data = xzalloc(sizeof *data); - northd_init(data); + northd_init(data, NULL); return data; } diff --git a/northd/en-port-binding-chassisredirect.c b/northd/en-port-binding-chassisredirect.c index 05e17472b..474d6170a 100644 --- a/northd/en-port-binding-chassisredirect.c +++ b/northd/en-port-binding-chassisredirect.c @@ -197,8 +197,8 @@ en_port_binding_chassisredirect_port_run(struct engine_node *node, void *data) struct chassisredirect_port *crp = chassisredirect_router_port_alloc(nbrp); upb = ovn_unpaired_port_binding_alloc(0, crp->name, - PB_CHASSISREDIRECT_PORT, - crp, rdgps->lr->sb); + PB_CHASSISREDIRECT_PORT, crp, + rdgps->lr->binding->sb); shash_add(&map->ports, crp->name, upb); } } @@ -235,8 +235,8 @@ en_port_binding_chassisredirect_port_run(struct engine_node *node, void *data) struct chassisredirect_port *crp = chassisredirect_switch_port_alloc(nbsp); upb = ovn_unpaired_port_binding_alloc(0, crp->name, - PB_CHASSISREDIRECT_PORT, - crp, localnets->ls->sb); + PB_CHASSISREDIRECT_PORT, crp, + localnets->ls->binding->sb); shash_add(&map->ports, crp->name, upb); } } diff --git a/northd/en-port-binding-logical-router-port.c b/northd/en-port-binding-logical-router-port.c index d47ba2e26..dfa78b9b2 100644 --- a/northd/en-port-binding-logical-router-port.c +++ b/northd/en-port-binding-logical-router-port.c @@ -97,7 +97,7 @@ en_port_binding_logical_router_port_run(struct engine_node *node, void *data) nbrp->name, PB_ROUTER_PORT, cookie, - paired_lr->sb); + paired_lr->binding->sb); smap_clone(&upb->external_ids, &nbrp->external_ids); if (!shash_add_once(&map->ports, nbrp->name, upb)) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1); diff --git a/northd/en-port-binding-logical-switch-port.c b/northd/en-port-binding-logical-switch-port.c index eca1fe85d..ec8e5aa42 100644 --- a/northd/en-port-binding-logical-switch-port.c +++ b/northd/en-port-binding-logical-switch-port.c @@ -117,7 +117,7 @@ en_port_binding_logical_switch_port_run(struct engine_node *node, void *data) nbsp->name, PB_SWITCH_PORT, cookie, - paired_ls->sb); + paired_ls->binding->sb); smap_clone(&upb->external_ids,  ->external_ids); const char *name = smap_get( ->external_ids, "neutron:port_name"); diff --git a/northd/en-port-binding-mirror.c b/northd/en-port-binding-mirror.c index f79d56259..a4c782d4b 100644 --- a/northd/en-port-binding-mirror.c +++ b/northd/en-port-binding-mirror.c @@ -107,13 +107,13 @@ en_port_binding_mirror_run(struct engine_node *node, void *data) if (!sset_find(&all_switch_ports, nb_mirror->sink)) { continue; } - struct mirror_port *mp = mirror_port_alloc(ls->sb, + struct mirror_port *mp = mirror_port_alloc(ls->binding->sb, nb_mirror->sink, nbsp); struct ovn_unpaired_port_binding *upb; upb = ovn_unpaired_port_binding_alloc(0, mp->name, PB_MIRROR_PORT, mp, - ls->sb); + ls->binding->sb); shash_add(&map->ports, mp->name, upb); } } diff --git a/northd/northd.c b/northd/northd.c index 39323aa5f..096c5f09c 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -505,17 +505,26 @@ struct lrouter_group { static void init_mcast_info_for_datapath(struct ovn_datapath *od); static struct ovn_datapath * -ovn_datapath_create(struct hmap *datapaths, const struct uuid *key, +ovn_datapath_create(struct ovn_datapaths *datapaths, const struct uuid *key, const struct nbrec_logical_switch *nbs, const struct nbrec_logical_router *nbr, - const struct sbrec_datapath_binding *sb) + const struct sbrec_datapath_binding *sb, + size_t index) { struct ovn_datapath *od = xzalloc(sizeof *od); od->key = *key; od->sb = sb; od->nbs = nbs; od->nbr = nbr; - hmap_insert(datapaths, &od->key_node, uuid_hash(&od->key)); + hmap_insert(&datapaths->datapaths, &od->key_node, uuid_hash(&od->key)); + /* Datapath indices correspond with the southbound datapath vector for + * the particular datapath type. This ensures that whether objects derive + * their own indices/bitmaps from the datapaths array or the sb_vec, + * the indices are consistent. + */ + datapaths->array[index] = od; + od->index = index; + od->datapaths = datapaths; od->lr_group = NULL; hmap_init(&od->ports); sset_init(&od->router_ips); @@ -829,25 +838,6 @@ parse_dynamic_routing_redistribute( return out; } -static void -ods_build_array_index(struct ovn_datapaths *datapaths) -{ - /* Assign unique sequential indexes to all datapaths. These are not - * visible outside of the northd loop, so, unlike the tunnel keys, it - * doesn't matter if they are different on every iteration. */ - size_t index = 0; - - datapaths->array = xrealloc(datapaths->array, - ods_size(datapaths) * sizeof *datapaths->array); - - struct ovn_datapath *od; - HMAP_FOR_EACH (od, key_node, &datapaths->datapaths) { - od->index = index; - datapaths->array[index++] = od; - od->datapaths = datapaths; - } -} - /* Initializes 'ls_datapaths' to contain a "struct ovn_datapath" for every * logical switch, and initializes 'lr_datapaths' to contain a * "struct ovn_datapath" for every logical router. @@ -861,9 +851,10 @@ build_datapaths(const struct ovn_synced_logical_switch_map *ls_map, struct ovn_synced_logical_switch *ls; HMAP_FOR_EACH (ls, hmap_node, &ls_map->synced_switches) { struct ovn_datapath *od = - ovn_datapath_create(&ls_datapaths->datapaths, + ovn_datapath_create(ls_datapaths, &ls->nb->header_.uuid, - ls->nb, NULL, ls->sb); + ls->nb, NULL, ls->binding->sb, + ls->binding->index); init_ipam_info_for_datapath(od); if (smap_get_bool(&od->nbs->other_config, "enable-stateless-acl-with-lb", @@ -875,9 +866,10 @@ build_datapaths(const struct ovn_synced_logical_switch_map *ls_map, struct ovn_synced_logical_router *lr; HMAP_FOR_EACH (lr, hmap_node, &lr_map->synced_routers) { struct ovn_datapath *od = - ovn_datapath_create(&lr_datapaths->datapaths, + ovn_datapath_create(lr_datapaths, &lr->nb->header_.uuid, - NULL, lr->nb, lr->sb); + NULL, lr->nb, lr->binding->sb, + lr->binding->index); if (smap_get(&od->nbr->options, "chassis")) { od->is_gw_router = true; } @@ -887,9 +879,6 @@ build_datapaths(const struct ovn_synced_logical_switch_map *ls_map, parse_dynamic_routing_redistribute(&od->nbr->options, DRRM_NONE, od->nbr->name); } - - ods_build_array_index(ls_datapaths); - ods_build_array_index(lr_datapaths); } static bool lsp_can_be_inc_processed(const struct nbrec_logical_switch_port *); @@ -2053,7 +2042,7 @@ join_logical_ports( struct shash_node *node; SHASH_FOR_EACH (node, &paired_lrps->paired_router_ports) { struct ovn_paired_logical_router_port *slrp = node->data; - od = ovn_datapath_from_sbrec_(lr_datapaths, slrp->router->sb); + od = ovn_datapath_from_sbrec_(lr_datapaths, slrp->router->binding->sb); if (!od) { /* This can happen if the router is not enabled */ continue; @@ -2072,8 +2061,7 @@ join_logical_ports( SHASH_FOR_EACH (node, &paired_lsps->paired_switch_ports) { struct ovn_paired_logical_switch_port *slsp = node->data; - od = ovn_datapath_from_sbrec_(ls_datapaths, slsp->sw->sb); - + od = ovn_datapath_from_sbrec_(ls_datapaths, slsp->sw->binding->sb); ovs_assert(od); join_logical_ports_lsp(ls_ports, od, slsp->nb, slsp->sb, @@ -18462,10 +18450,10 @@ build_static_mac_binding_table( } static void -ovn_datapaths_init(struct ovn_datapaths *datapaths) +ovn_datapaths_init(struct ovn_datapaths *datapaths, size_t n_datapaths) { hmap_init(&datapaths->datapaths); - datapaths->array = NULL; + datapaths->array = xcalloc(n_datapaths, sizeof *datapaths->array); } static void @@ -18518,10 +18506,12 @@ destroy_datapaths_and_ports(struct ovn_datapaths *ls_datapaths, } void -northd_init(struct northd_data *data) +northd_init(struct northd_data *data, const struct northd_input *ni) { - ovn_datapaths_init(&data->ls_datapaths); - ovn_datapaths_init(&data->lr_datapaths); + ovn_datapaths_init(&data->ls_datapaths, + ni ? vector_len(&ni->synced_lses->datapaths.bindings_vec) : 0); + ovn_datapaths_init(&data->lr_datapaths, + ni ? vector_len(&ni->synced_lrs->datapaths.bindings_vec) : 0); hmap_init(&data->ls_ports); hmap_init(&data->lr_ports); hmap_init(&data->lb_datapaths_map); diff --git a/northd/northd.h b/northd/northd.h index 23c2fad49..74ef05892 100644 --- a/northd/northd.h +++ b/northd/northd.h @@ -834,7 +834,7 @@ bool northd_handle_lr_changes(const struct northd_input *, struct northd_data *); void destroy_northd_data_tracked_changes(struct northd_data *); void northd_destroy(struct northd_data *data); -void northd_init(struct northd_data *data); +void northd_init(struct northd_data *data, const struct northd_input *); void northd_indices_create(struct northd_data *data, struct ovsdb_idl *ovnsb_idl); -- 2.47.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev