On 25/10/2021 04:21, Han Zhou wrote: > On Mon, Oct 18, 2021 at 5:14 AM Mark Gray <mark.d.g...@redhat.com> wrote: >> >> 'struct northd_data' is used to hold the output data from the >> incremental processing node 'en_northd'. This will be used, in >> a later commit, as the input data to 'en_lflow'. In order to achieve >> this, we refactor in the following way: >> >> * Introduce northd_init() which initializes this data. >> * Introduce northd_destroy() which clears this data for a new iteration. >> * Introduce northd_indices_create() which does a one-time creation of >> indices for number of tables needed by northd. >> * Remove 'ovn_internal_version' from the context passed to northd >> as it can be determined within northd using ovn_get_internal_version. >> * Remove 'use_parallel_build' from the context passed to northd >> as it can be determined within northd using can_parallelize_hashes(). >> * Refactor northd.c to use 'struct northd_data' where applicable. >> >> Signed-off-by: Mark Gray <mark.d.g...@redhat.com> >> --- >> northd/en-northd.c | 28 ++++- >> northd/en-northd.h | 4 + >> northd/northd.c | 278 ++++++++++++++++++++++++-------------------- >> northd/northd.h | 28 ++++- >> northd/ovn-northd.c | 28 +---- >> 5 files changed, 204 insertions(+), 162 deletions(-) >> >> diff --git a/northd/en-northd.c b/northd/en-northd.c >> index 8dec51535af0..1b206521e152 100644 >> --- a/northd/en-northd.c >> +++ b/northd/en-northd.c >> @@ -20,26 +20,46 @@ >> >> #include "en-northd.h" >> #include "lib/inc-proc-eng.h" >> +#include "openvswitch/list.h" /* TODO This is needed for > ovn-parallel-hmap.h. >> + * lib/ovn-parallel-hmap.h should be > updated >> + * to include this dependency itself */ >> +#include "lib/ovn-parallel-hmap.h" >> #include "northd.h" >> +#include "lib/util.h" >> #include "openvswitch/vlog.h" >> >> VLOG_DEFINE_THIS_MODULE(en_northd); >> >> -void en_northd_run(struct engine_node *node, void *data OVS_UNUSED) >> +void en_northd_run(struct engine_node *node, void *data) >> { >> const struct engine_context *eng_ctx = engine_get_context(); >> struct northd_idl_context *ctx = eng_ctx->client_ctx; >> - ovn_db_run(ctx); >> + struct northd_data *northd_data = ((struct ed_type_northd > *)data)->data; >> >> + northd_destroy(northd_data); >> + northd_init(northd_data); >> + >> + northd_run(ctx, northd_data); >> engine_set_node_state(node, EN_UPDATED); >> >> } >> void *en_northd_init(struct engine_node *node OVS_UNUSED, >> - struct engine_arg *arg OVS_UNUSED) >> + struct engine_arg *arg) >> { >> - return NULL; >> + struct ed_type_northd *data = xmalloc(sizeof *data); >> + data->data = xmalloc(sizeof *data->data); >> + >> + data->data->use_parallel_build = can_parallelize_hashes(false); >> + northd_indices_create(data->data, arg->sb_idl); > > As mentioned in my comment in patch 2, the OVSDB indices should belong to > the data of the corresponding OVSDB table, because 1) it is more natural, > 2) different engine nodes can share the same input and so same OVSDB index. > engine_ovsdb_node_add_index() can be used to add an index for an OVSDB > table.
Yeah, I just discovered that the I-P framework allows for this model. > >> + northd_init(data->data); >> + >> + return data; >> } >> >> void en_northd_cleanup(void *data OVS_UNUSED) >> { >> + struct northd_data *northd_data = ((struct ed_type_northd > *)data)->data; >> + >> + northd_destroy(northd_data); >> + free(northd_data); >> } >> diff --git a/northd/en-northd.h b/northd/en-northd.h >> index 0e7f76245e69..da386298d821 100644 >> --- a/northd/en-northd.h >> +++ b/northd/en-northd.h >> @@ -9,6 +9,10 @@ >> >> #include "lib/inc-proc-eng.h" >> >> +struct ed_type_northd { >> + struct northd_data *data; >> +}; > > northd_data is for the engine node en-northd only, so why not define it > directly in the struct ed_type_northd? It seems unnecessary to have another > struct that just adds one more layer when accessing the fields. > (besides, with the current nested structure, the outer one is not freed in > the en_northd_cleanup()) Makes sense. > >> + >> void en_northd_run(struct engine_node *node OVS_UNUSED, void *data > OVS_UNUSED); >> void *en_northd_init(struct engine_node *node OVS_UNUSED, >> struct engine_arg *arg); >> diff --git a/northd/northd.c b/northd/northd.c >> index d61368c1e406..6426fcbe1215 100644 >> --- a/northd/northd.c >> +++ b/northd/northd.c >> @@ -2950,6 +2950,7 @@ chassis_group_list_changed( >> >> static void >> sync_ha_chassis_group_for_sbpb(struct northd_idl_context *ctx, >> + struct northd_data *data, >> const struct nbrec_ha_chassis_group > *nb_ha_grp, >> struct ovsdb_idl_index > *sbrec_chassis_by_name, >> const struct sbrec_port_binding *pb) >> @@ -2957,7 +2958,7 @@ sync_ha_chassis_group_for_sbpb(struct > northd_idl_context *ctx, >> bool new_sb_chassis_group = false; >> const struct sbrec_ha_chassis_group *sb_ha_grp = >> ha_chassis_group_lookup_by_name( >> - ctx->sbrec_ha_chassis_grp_by_name, nb_ha_grp->name); >> + data->sbrec_ha_chassis_grp_by_name, nb_ha_grp->name); >> >> if (!sb_ha_grp) { >> sb_ha_grp = sbrec_ha_chassis_group_insert(ctx->ovnsb_txn); >> @@ -3003,6 +3004,7 @@ sync_ha_chassis_group_for_sbpb(struct > northd_idl_context *ctx, >> static void >> copy_gw_chassis_from_nbrp_to_sbpb( >> struct northd_idl_context *ctx, >> + struct northd_data *data, >> struct ovsdb_idl_index *sbrec_chassis_by_name, >> const struct nbrec_logical_router_port *lrp, >> const struct sbrec_port_binding *port_binding) >> @@ -3012,7 +3014,7 @@ copy_gw_chassis_from_nbrp_to_sbpb( >> * for the distributed gateway router port. */ >> const struct sbrec_ha_chassis_group *sb_ha_chassis_group = >> ha_chassis_group_lookup_by_name( >> - ctx->sbrec_ha_chassis_grp_by_name, lrp->name); >> + data->sbrec_ha_chassis_grp_by_name, lrp->name); >> if (!sb_ha_chassis_group) { >> sb_ha_chassis_group = > sbrec_ha_chassis_group_insert(ctx->ovnsb_txn); >> sbrec_ha_chassis_group_set_name(sb_ha_chassis_group, lrp->name); >> @@ -3081,6 +3083,7 @@ ovn_update_ipv6_prefix(struct hmap *ports) >> >> static void >> ovn_port_update_sbrec(struct northd_idl_context *ctx, >> + struct northd_data *data, >> struct ovsdb_idl_index *sbrec_chassis_by_name, >> const struct ovn_port *op, >> struct hmap *chassis_qdisc_queues, >> @@ -3115,7 +3118,8 @@ ovn_port_update_sbrec(struct northd_idl_context > *ctx, >> } >> >> /* HA Chassis group is set. Ignore 'gateway_chassis'. */ >> - sync_ha_chassis_group_for_sbpb(ctx, > op->nbrp->ha_chassis_group, >> + sync_ha_chassis_group_for_sbpb(ctx, data, >> + > op->nbrp->ha_chassis_group, >> sbrec_chassis_by_name, > op->sb); >> sset_add(active_ha_chassis_grps, >> op->nbrp->ha_chassis_group->name); >> @@ -3125,7 +3129,7 @@ ovn_port_update_sbrec(struct northd_idl_context > *ctx, >> * associated with the lrp. */ >> if (sbpb_gw_chassis_needs_update(op->sb, op->nbrp, >> sbrec_chassis_by_name)) > { >> - copy_gw_chassis_from_nbrp_to_sbpb(ctx, >> + copy_gw_chassis_from_nbrp_to_sbpb(ctx, data, >> > sbrec_chassis_by_name, >> op->nbrp, op->sb); >> } >> @@ -3249,7 +3253,7 @@ ovn_port_update_sbrec(struct northd_idl_context > *ctx, >> if (!strcmp(op->nbsp->type, "external")) { >> if (op->nbsp->ha_chassis_group) { >> sync_ha_chassis_group_for_sbpb( >> - ctx, op->nbsp->ha_chassis_group, >> + ctx, data, op->nbsp->ha_chassis_group, >> sbrec_chassis_by_name, op->sb); >> sset_add(active_ha_chassis_grps, >> op->nbsp->ha_chassis_group->name); >> @@ -3943,6 +3947,7 @@ ovn_port_allocate_key(struct northd_idl_context > *ctx, struct hmap *ports, >> * datapaths. */ >> static void >> build_ports(struct northd_idl_context *ctx, >> + struct northd_data *data, >> struct ovsdb_idl_index *sbrec_chassis_by_name, >> struct hmap *datapaths, struct hmap *ports) >> { >> @@ -3998,7 +4003,7 @@ build_ports(struct northd_idl_context *ctx, >> if (op->nbsp) { >> tag_alloc_create_new_tag(&tag_alloc_table, op->nbsp); >> } >> - ovn_port_update_sbrec(ctx, sbrec_chassis_by_name, >> + ovn_port_update_sbrec(ctx, data, sbrec_chassis_by_name, >> op, &chassis_qdisc_queues, >> &active_ha_chassis_grps); >> } >> @@ -4006,7 +4011,7 @@ build_ports(struct northd_idl_context *ctx, >> /* Add southbound record for each unmatched northbound record. */ >> LIST_FOR_EACH_SAFE (op, next, list, &nb_only) { >> op->sb = sbrec_port_binding_insert(ctx->ovnsb_txn); >> - ovn_port_update_sbrec(ctx, sbrec_chassis_by_name, op, >> + ovn_port_update_sbrec(ctx, data, sbrec_chassis_by_name, op, >> &chassis_qdisc_queues, >> &active_ha_chassis_grps); >> sbrec_port_binding_set_logical_port(op->sb, op->key); >> @@ -4209,7 +4214,8 @@ ovn_igmp_group_find(struct hmap *igmp_groups, >> } >> >> static struct ovn_igmp_group * >> -ovn_igmp_group_add(struct northd_idl_context *ctx, struct hmap > *igmp_groups, >> +ovn_igmp_group_add(struct northd_data *data, >> + struct hmap *igmp_groups, >> struct ovn_datapath *datapath, >> const struct in6_addr *address, >> const char *address_s) >> @@ -4221,7 +4227,7 @@ ovn_igmp_group_add(struct northd_idl_context *ctx, > struct hmap *igmp_groups, >> igmp_group = xmalloc(sizeof *igmp_group); >> >> const struct sbrec_multicast_group *mcgroup = >> - mcast_group_lookup(ctx->sbrec_mcast_group_by_name_dp, > address_s, >> + mcast_group_lookup(data->sbrec_mcast_group_by_name_dp, > address_s, >> datapath->sb); >> >> igmp_group->datapath = datapath; >> @@ -13323,12 +13329,7 @@ static bool reset_parallel = false; >> /* Updates the Logical_Flow and Multicast_Group tables in the OVN_SB > database, >> * constructing their contents based on the OVN_NB database. */ >> static void >> -build_lflows(struct northd_idl_context *ctx, struct hmap *datapaths, >> - struct hmap *ports, struct hmap *port_groups, >> - struct hmap *mcgroups, struct hmap *igmp_groups, >> - struct shash *meter_groups, >> - struct hmap *lbs, struct hmap *bfd_connections, >> - bool ovn_internal_version_changed) >> +build_lflows(struct northd_idl_context *ctx, struct northd_data *data) >> { >> struct hmap lflows; >> >> @@ -13350,10 +13351,11 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> use_parallel_build = false; >> reset_parallel = true; >> } >> - build_lswitch_and_lrouter_flows(datapaths, ports, >> - port_groups, &lflows, mcgroups, >> - igmp_groups, meter_groups, lbs, >> - bfd_connections); >> + build_lswitch_and_lrouter_flows(&data->datapaths, &data->ports, >> + &data->port_groups, &lflows, >> + &data->mcast_groups, > &data->igmp_groups, >> + &data->meter_groups, &data->lbs, >> + &data->bfd_connections); >> >> /* Parallel build may result in a suboptimal hash. Resize the >> * hash to a correct size before doing lookups */ >> @@ -13422,7 +13424,8 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> /* 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(datapaths, dp); >> + logical_datapath_od = ovn_datapath_from_sbrec( >> + &data->datapaths, dp); >> if (logical_datapath_od >> && ovn_datapath_is_stale(logical_datapath_od)) { >> logical_datapath_od = NULL; >> @@ -13430,7 +13433,7 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> } >> for (i = 0; dp_group && i < dp_group->n_datapaths; i++) { >> logical_datapath_od = ovn_datapath_from_sbrec( >> - datapaths, dp_group->datapaths[i]); >> + &data->datapaths, > dp_group->datapaths[i]); >> if (logical_datapath_od >> && !ovn_datapath_is_stale(logical_datapath_od)) { >> break; >> @@ -13454,7 +13457,7 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> sbflow->priority, sbflow->match, sbflow->actions, >> sbflow->controller_meter, sbflow->hash); >> if (lflow) { >> - if (ovn_internal_version_changed) { >> + if (data->ovn_internal_version_changed) { >> const char *stage_name = > smap_get_def(&sbflow->external_ids, >> "stage-name", ""); >> const char *stage_hint = > smap_get_def(&sbflow->external_ids, >> @@ -13506,7 +13509,7 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> /* Check all logical datapaths from the group. */ >> for (i = 0; i < dp_group->n_datapaths; i++) { >> od[n_datapaths] = ovn_datapath_from_sbrec( >> - datapaths, > dp_group->datapaths[i]); >> + &data->datapaths, > dp_group->datapaths[i]); >> if (!od[n_datapaths] >> || ovn_datapath_is_stale(od[n_datapaths])) { >> continue; >> @@ -13602,7 +13605,7 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> /* Push changes to the Multicast_Group table to database. */ >> const struct sbrec_multicast_group *sbmc, *next_sbmc; >> SBREC_MULTICAST_GROUP_FOR_EACH_SAFE (sbmc, next_sbmc, > ctx->ovnsb_idl) { > > We shouldn't use ovnsb_idl directly to get table access, because it is not > from input dependencies. In the engine functions we should only rely on > data retrieved from input nodes to ensure I-P correctness. > The macro SBREC_MULTICAST_GROUP_TABLE_FOR_EACH is for this purpose. > The variable of struct sbrec_multicast_group_table can be retrieved from > the engine node's input using EN_OVSDB_GET(<input OVSDB node>). > This is just an example, and all the NB/SB table access should be in this > way for I-P. Yes > >> - struct ovn_datapath *od = ovn_datapath_from_sbrec(datapaths, >> + struct ovn_datapath *od = > ovn_datapath_from_sbrec(&data->datapaths, >> > sbmc->datapath); >> >> if (!od || ovn_datapath_is_stale(od)) { >> @@ -13612,18 +13615,19 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> >> struct multicast_group group = { .name = sbmc->name, >> .key = sbmc->tunnel_key }; >> - struct ovn_multicast *mc = ovn_multicast_find(mcgroups, od, > &group); >> + struct ovn_multicast *mc = > ovn_multicast_find(&data->mcast_groups, >> + od, &group); >> if (mc) { >> ovn_multicast_update_sbrec(mc, sbmc); >> - ovn_multicast_destroy(mcgroups, mc); >> + ovn_multicast_destroy(&data->mcast_groups, mc); >> } else { >> sbrec_multicast_group_delete(sbmc); >> } >> } >> struct ovn_multicast *mc, *next_mc; >> - HMAP_FOR_EACH_SAFE (mc, next_mc, hmap_node, mcgroups) { >> + HMAP_FOR_EACH_SAFE (mc, next_mc, hmap_node, &data->mcast_groups) { >> if (!mc->datapath) { >> - ovn_multicast_destroy(mcgroups, mc); >> + ovn_multicast_destroy(&data->mcast_groups, mc); >> continue; >> } >> sbmc = sbrec_multicast_group_insert(ctx->ovnsb_txn); >> @@ -13631,7 +13635,7 @@ build_lflows(struct northd_idl_context *ctx, > struct hmap *datapaths, >> sbrec_multicast_group_set_name(sbmc, mc->group->name); >> sbrec_multicast_group_set_tunnel_key(sbmc, mc->group->key); >> ovn_multicast_update_sbrec(mc, sbmc); >> - ovn_multicast_destroy(mcgroups, mc); >> + ovn_multicast_destroy(&data->mcast_groups, mc); >> } >> } >> >> @@ -14141,7 +14145,8 @@ destroy_datapaths_and_ports(struct hmap > *datapaths, struct hmap *ports, >> } >> >> static void >> -build_ip_mcast(struct northd_idl_context *ctx, struct hmap *datapaths) >> +build_ip_mcast(struct northd_idl_context *ctx, struct northd_data *data, >> + struct hmap *datapaths) >> { >> struct ovn_datapath *od; >> >> @@ -14151,7 +14156,7 @@ build_ip_mcast(struct northd_idl_context *ctx, > struct hmap *datapaths) >> } >> >> const struct sbrec_ip_multicast *ip_mcast = >> - ip_mcast_lookup(ctx->sbrec_ip_mcast_by_dp, od->sb); >> + ip_mcast_lookup(data->sbrec_ip_mcast_by_dp, od->sb); >> >> if (!ip_mcast) { >> ip_mcast = sbrec_ip_multicast_insert(ctx->ovnsb_txn); >> @@ -14172,6 +14177,7 @@ build_ip_mcast(struct northd_idl_context *ctx, > struct hmap *datapaths) >> >> static void >> build_mcast_groups(struct northd_idl_context *ctx, >> + struct northd_data *data, >> struct hmap *datapaths, struct hmap *ports, >> struct hmap *mcast_groups, >> struct hmap *igmp_groups) >> @@ -14267,7 +14273,7 @@ build_mcast_groups(struct northd_idl_context *ctx, >> * if the multicast group already exists. >> */ >> struct ovn_igmp_group *igmp_group = >> - ovn_igmp_group_add(ctx, igmp_groups, od, &group_address, >> + ovn_igmp_group_add(data, igmp_groups, od, &group_address, >> sb_igmp->address); >> >> /* Add the extracted ports to the IGMP group. */ >> @@ -14311,7 +14317,7 @@ build_mcast_groups(struct northd_idl_context *ctx, >> } >> >> struct ovn_igmp_group *igmp_group_rtr = >> - ovn_igmp_group_add(ctx, igmp_groups, router_port->od, >> + ovn_igmp_group_add(data, igmp_groups, > router_port->od, >> address, igmp_group->mcgroup.name > ); >> struct ovn_port **router_igmp_ports = >> xmalloc(sizeof *router_igmp_ports); >> @@ -14355,26 +14361,89 @@ build_meter_groups(struct northd_idl_context > *ctx, >> } >> } >> >> +void >> +northd_indices_create(struct northd_data *data, >> + struct ovsdb_idl *ovnsb_idl) >> +{ >> + data->sbrec_chassis_by_name = chassis_index_create(ovnsb_idl); >> + data->sbrec_ha_chassis_grp_by_name >> + = ha_chassis_group_index_create(ovnsb_idl); >> + data->sbrec_mcast_group_by_name_dp >> + = mcast_group_index_create(ovnsb_idl); >> + data->sbrec_ip_mcast_by_dp = ip_mcast_index_create(ovnsb_idl); >> +} >> + >> +void >> +northd_init(struct northd_data *data) >> +{ >> + hmap_init(&data->datapaths); >> + hmap_init(&data->ports); >> + hmap_init(&data->port_groups); >> + hmap_init(&data->mcast_groups); >> + hmap_init(&data->igmp_groups); >> + shash_init(&data->meter_groups); >> + hmap_init(&data->lbs); >> + hmap_init(&data->bfd_connections); >> + ovs_list_init(&data->lr_list); >> + data->ovn_internal_version_changed = false; >> +} >> + >> +void >> +northd_destroy(struct northd_data *data) >> +{ >> + struct ovn_northd_lb *lb; >> + HMAP_FOR_EACH_POP (lb, hmap_node, &data->lbs) { >> + ovn_northd_lb_destroy(lb); >> + } >> + hmap_destroy(&data->lbs); >> + >> + struct ovn_igmp_group *igmp_group, *next_igmp_group; >> + >> + HMAP_FOR_EACH_SAFE (igmp_group, next_igmp_group, hmap_node, >> + &data->igmp_groups) { >> + ovn_igmp_group_destroy(&data->igmp_groups, igmp_group); >> + } >> + >> + struct ovn_port_group *pg, *next_pg; >> + HMAP_FOR_EACH_SAFE (pg, next_pg, key_node, &data->port_groups) { >> + ovn_port_group_destroy(&data->port_groups, pg); >> + } >> + >> + hmap_destroy(&data->igmp_groups); >> + hmap_destroy(&data->mcast_groups); >> + hmap_destroy(&data->port_groups); >> + hmap_destroy(&data->bfd_connections); >> + >> + struct shash_node *node, *next; >> + SHASH_FOR_EACH_SAFE (node, next, &data->meter_groups) { >> + shash_delete(&data->meter_groups, node); >> + } >> + shash_destroy(&data->meter_groups); >> + >> + /* XXX Having to explicitly clean up macam here >> + * is a bit strange. We don't explicitly initialize >> + * macam in this module, but this is the logical place >> + * to clean it up. Ideally, more IPAM logic can be factored >> + * out of ovn-northd and this can be taken care of there >> + * as well. >> + */ >> + cleanup_macam(); >> + >> + destroy_datapaths_and_ports(&data->datapaths, &data->ports, >> + &data->lr_list); >> +} >> + >> static void >> -ovnnb_db_run(struct northd_idl_context *ctx, >> +ovnnb_db_run(struct northd_data *data, >> + struct northd_idl_context *ctx, >> struct ovsdb_idl_index *sbrec_chassis_by_name, >> struct ovsdb_idl_loop *sb_loop, >> - struct hmap *datapaths, struct hmap *ports, >> - struct ovs_list *lr_list, >> - int64_t loop_start_time, >> - const char *ovn_internal_version) >> + int64_t loop_start_time) >> { >> if (!ctx->ovnsb_txn || !ctx->ovnnb_txn) { >> return; >> } >> stopwatch_start(BUILD_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); >> - struct hmap port_groups; >> - struct hmap mcast_groups; >> - struct hmap igmp_groups; >> - struct shash meter_groups = SHASH_INITIALIZER(&meter_groups); >> - struct hmap lbs; >> - struct hmap bfd_connections = HMAP_INITIALIZER(&bfd_connections); >> - bool ovn_internal_version_changed = true; >> >> /* Sync ipsec configuration. >> * Copy nb_cfg from northbound to southbound database. >> @@ -14426,13 +14495,15 @@ ovnnb_db_run(struct northd_idl_context *ctx, >> smap_replace(&options, "max_tunid", max_tunid); >> free(max_tunid); >> >> + char *ovn_internal_version = ovn_get_internal_version(); >> if (!strcmp(ovn_internal_version, >> smap_get_def(&options, "northd_internal_version", ""))) { >> - ovn_internal_version_changed = false; >> + data->ovn_internal_version_changed = false; >> } else { >> smap_replace(&options, "northd_internal_version", >> ovn_internal_version); >> } >> + free(ovn_internal_version); >> >> if (!smap_equal(&nb->options, &options)) { >> nbrec_nb_global_verify_options(nb); >> @@ -14456,72 +14527,34 @@ ovnnb_db_run(struct northd_idl_context *ctx, >> check_lsp_is_up = !smap_get_bool(&nb->options, >> "ignore_lsp_down", true); >> >> - build_datapaths(ctx, datapaths, lr_list); >> - build_ovn_lbs(ctx, datapaths, &lbs); >> - build_lrouter_lbs(datapaths, &lbs); >> - build_ports(ctx, sbrec_chassis_by_name, datapaths, ports); >> - build_ovn_lr_lbs(datapaths, &lbs); >> - build_ovn_lb_svcs(ctx, ports, &lbs); >> - build_ipam(datapaths, ports); >> - build_port_group_lswitches(ctx, &port_groups, ports); >> - build_lrouter_groups(ports, lr_list); >> - build_ip_mcast(ctx, datapaths); >> - build_mcast_groups(ctx, datapaths, ports, &mcast_groups, > &igmp_groups); >> - build_meter_groups(ctx, &meter_groups); >> - build_bfd_table(ctx, &bfd_connections, ports); >> + build_datapaths(ctx, &data->datapaths, &data->lr_list); >> + build_ovn_lbs(ctx, &data->datapaths, &data->lbs); >> + build_lrouter_lbs(&data->datapaths, &data->lbs); >> + build_ports(ctx, data, sbrec_chassis_by_name, >> + &data->datapaths, &data->ports); >> + build_ovn_lr_lbs(&data->datapaths, &data->lbs); >> + build_ovn_lb_svcs(ctx, &data->ports, &data->lbs); >> + build_ipam(&data->datapaths, &data->ports); >> + build_port_group_lswitches(ctx, &data->port_groups, &data->ports); >> + build_lrouter_groups(&data->ports, &data->lr_list); >> + build_ip_mcast(ctx, data, &data->datapaths); >> + build_mcast_groups(ctx, data, &data->datapaths, &data->ports, >> + &data->mcast_groups, &data->igmp_groups); >> + build_meter_groups(ctx, &data->meter_groups); >> + build_bfd_table(ctx, &data->bfd_connections, &data->ports); >> stopwatch_stop(BUILD_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); >> stopwatch_start(BUILD_LFLOWS_STOPWATCH_NAME, time_msec()); >> - build_lflows(ctx, datapaths, ports, &port_groups, &mcast_groups, >> - &igmp_groups, &meter_groups, &lbs, &bfd_connections, >> - ovn_internal_version_changed); >> + build_lflows(ctx, data); >> stopwatch_stop(BUILD_LFLOWS_STOPWATCH_NAME, time_msec()); >> stopwatch_start(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); >> - ovn_update_ipv6_prefix(ports); >> - >> - sync_address_sets(ctx, datapaths); >> - sync_port_groups(ctx, &port_groups); >> - sync_meters(ctx, &meter_groups); >> - sync_dns_entries(ctx, datapaths); >> - cleanup_stale_fdp_entries(ctx, datapaths); >> - >> - struct ovn_northd_lb *lb; >> - HMAP_FOR_EACH_POP (lb, hmap_node, &lbs) { >> - ovn_northd_lb_destroy(lb); >> - } >> - hmap_destroy(&lbs); >> - >> - struct ovn_igmp_group *igmp_group, *next_igmp_group; >> - >> - HMAP_FOR_EACH_SAFE (igmp_group, next_igmp_group, hmap_node, > &igmp_groups) { >> - ovn_igmp_group_destroy(&igmp_groups, igmp_group); >> - } >> - >> - struct ovn_port_group *pg, *next_pg; >> - HMAP_FOR_EACH_SAFE (pg, next_pg, key_node, &port_groups) { >> - ovn_port_group_destroy(&port_groups, pg); >> - } >> - >> - bfd_cleanup_connections(ctx, &bfd_connections); >> - >> - hmap_destroy(&igmp_groups); >> - hmap_destroy(&mcast_groups); >> - hmap_destroy(&port_groups); >> - hmap_destroy(&bfd_connections); >> - >> - struct shash_node *node, *next; >> - SHASH_FOR_EACH_SAFE (node, next, &meter_groups) { >> - shash_delete(&meter_groups, node); >> - } >> - shash_destroy(&meter_groups); >> - >> - /* XXX Having to explicitly clean up macam here >> - * is a bit strange. We don't explicitly initialize >> - * macam in this module, but this is the logical place >> - * to clean it up. Ideally, more IPAM logic can be factored >> - * out of ovn-northd and this can be taken care of there >> - * as well. >> - */ >> - cleanup_macam(); >> + ovn_update_ipv6_prefix(&data->ports); >> + >> + sync_address_sets(ctx, &data->datapaths); >> + sync_port_groups(ctx, &data->port_groups); >> + sync_meters(ctx, &data->meter_groups); >> + sync_dns_entries(ctx, &data->datapaths); >> + cleanup_stale_fdp_entries(ctx, &data->datapaths); >> + bfd_cleanup_connections(ctx, &data->bfd_connections); >> stopwatch_stop(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); >> >> } >> @@ -14638,7 +14671,7 @@ update_sb_ha_group_ref_chassis(struct > northd_idl_context *ctx, >> * - 'ref_chassis' of hagrp1. >> */ >> static void >> -build_ha_chassis_group_ref_chassis(struct northd_idl_context *ctx, >> +build_ha_chassis_group_ref_chassis(struct northd_data *data, >> const struct sbrec_port_binding *sb, >> struct ovn_port *op, >> struct shash *ha_ref_chassis_map) >> @@ -14664,7 +14697,7 @@ build_ha_chassis_group_ref_chassis(struct > northd_idl_context *ctx, >> SSET_FOR_EACH (ha_group_name, &lr_group->ha_chassis_groups) { >> const struct sbrec_ha_chassis_group *sb_ha_chassis_grp; >> sb_ha_chassis_grp = ha_chassis_group_lookup_by_name( >> - ctx->sbrec_ha_chassis_grp_by_name, ha_group_name); >> + data->sbrec_ha_chassis_grp_by_name, ha_group_name); >> >> if (sb_ha_chassis_grp) { >> struct ha_ref_chassis_info *ref_ch_info = >> @@ -14679,7 +14712,8 @@ build_ha_chassis_group_ref_chassis(struct > northd_idl_context *ctx, >> * this column is not empty, it means we need to set the corresponding > logical >> * port as 'up' in the northbound DB. */ >> static void >> -handle_port_binding_changes(struct northd_idl_context *ctx, struct hmap > *ports, >> +handle_port_binding_changes(struct northd_idl_context *ctx, >> + struct northd_data *data, struct hmap *ports, >> struct shash *ha_ref_chassis_map) >> { >> const struct sbrec_port_binding *sb; >> @@ -14725,7 +14759,7 @@ handle_port_binding_changes(struct > northd_idl_context *ctx, struct hmap *ports, >> if (build_ha_chassis_ref && ctx->ovnsb_txn && sb->chassis) { >> /* Check and add the chassis which has claimed this 'sb' >> * to the ha chassis group's ref_chassis if required. */ >> - build_ha_chassis_group_ref_chassis(ctx, sb, op, >> + build_ha_chassis_group_ref_chassis(data, sb, op, >> ha_ref_chassis_map); >> } >> } >> @@ -14786,6 +14820,7 @@ update_northbound_cfg(struct northd_idl_context > *ctx, >> /* Handle a fairly small set of changes in the southbound database. */ >> static void >> ovnsb_db_run(struct northd_idl_context *ctx, >> + struct northd_data *data, >> struct ovsdb_idl_loop *sb_loop, >> struct hmap *ports, >> int64_t loop_start_time) >> @@ -14795,7 +14830,7 @@ ovnsb_db_run(struct northd_idl_context *ctx, >> } >> >> struct shash ha_ref_chassis_map = > SHASH_INITIALIZER(&ha_ref_chassis_map); >> - handle_port_binding_changes(ctx, ports, &ha_ref_chassis_map); >> + handle_port_binding_changes(ctx, data, ports, &ha_ref_chassis_map); >> update_northbound_cfg(ctx, sb_loop, loop_start_time); >> if (ctx->ovnsb_txn) { >> update_sb_ha_group_ref_chassis(ctx, &ha_ref_chassis_map); >> @@ -14804,25 +14839,18 @@ ovnsb_db_run(struct northd_idl_context *ctx, >> } >> >> void >> -ovn_db_run(struct northd_idl_context *ctx) >> +northd_run(struct northd_idl_context *ctx, struct northd_data *data) >> { >> - struct hmap datapaths, ports; >> - struct ovs_list lr_list; >> - ovs_list_init(&lr_list); >> - hmap_init(&datapaths); >> - hmap_init(&ports); >> - use_parallel_build = ctx->use_parallel_build; >> + use_parallel_build = data->use_parallel_build; > > This doesn't seem to really matter, because in ovn_nb_run() it is > overridden by the NB option use_parallel_build. So it should be removed > from the data. It is an input of this engine node. > Meanwhile, there is a pending patch that moves the input from NB options to > unix commands. I am not sure about the motivation: > https://patchwork.ozlabs.org/project/ovn/patch/20210921154827.25940-2-anton.iva...@cambridgegreys.com/ > Ack, I will remove it. > Thanks, > Han > >> >> int64_t start_time = time_wall_msec(); >> >> stopwatch_start(OVNNB_DB_RUN_STOPWATCH_NAME, time_msec()); >> - ovnnb_db_run(ctx, ctx->sbrec_chassis_by_name, ctx->ovnsb_idl_loop, >> - &datapaths, &ports, &lr_list, start_time, >> - ctx->ovn_internal_version); >> + ovnnb_db_run(data, ctx, data->sbrec_chassis_by_name, > ctx->ovnsb_idl_loop, >> + start_time); >> stopwatch_stop(OVNNB_DB_RUN_STOPWATCH_NAME, time_msec()); >> stopwatch_start(OVNSB_DB_RUN_STOPWATCH_NAME, time_msec()); >> - ovnsb_db_run(ctx, ctx->ovnsb_idl_loop, &ports, start_time); >> + ovnsb_db_run(ctx, data, ctx->ovnsb_idl_loop, &data->ports, > start_time); >> stopwatch_stop(OVNSB_DB_RUN_STOPWATCH_NAME, time_msec()); >> - destroy_datapaths_and_ports(&datapaths, &ports, &lr_list); >> } >> >> diff --git a/northd/northd.h b/northd/northd.h >> index ea7f841c7a49..d4bc5cf16541 100644 >> --- a/northd/northd.h >> +++ b/northd/northd.h >> @@ -16,24 +16,40 @@ >> >> #include "ovsdb-idl.h" >> >> +#include "openvswitch/hmap.h" >> + >> struct northd_idl_context { >> - const char *ovnnb_db; >> - const char *ovnsb_db; >> struct ovsdb_idl *ovnnb_idl; >> struct ovsdb_idl *ovnsb_idl; >> struct ovsdb_idl_loop *ovnnb_idl_loop; >> struct ovsdb_idl_loop *ovnsb_idl_loop; >> struct ovsdb_idl_txn *ovnnb_txn; >> struct ovsdb_idl_txn *ovnsb_txn; >> +}; >> + >> +struct northd_data { >> + struct hmap datapaths; >> + struct hmap ports; >> + struct hmap port_groups; >> + struct hmap mcast_groups; >> + struct hmap igmp_groups; >> + struct shash meter_groups; >> + struct hmap lbs; >> + struct hmap bfd_connections; >> + struct ovs_list lr_list; >> + bool ovn_internal_version_changed; >> + bool use_parallel_build; >> + >> struct ovsdb_idl_index *sbrec_chassis_by_name; >> struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name; >> struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp; >> struct ovsdb_idl_index *sbrec_ip_mcast_by_dp; >> - >> - const char *ovn_internal_version; >> - bool use_parallel_build; >> }; >> >> -void ovn_db_run(struct northd_idl_context *ctx); >> +void northd_run(struct northd_idl_context *ctx, struct northd_data > *data); >> +void northd_destroy(struct northd_data *data); >> +void northd_init(struct northd_data *data); >> +void northd_indices_create(struct northd_data *data, >> + struct ovsdb_idl *ovnsb_idl); >> >> #endif /* NORTHD_H */ >> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c >> index 3a780cef6606..c7192d2ba065 100644 >> --- a/northd/ovn-northd.c >> +++ b/northd/ovn-northd.c >> @@ -31,7 +31,6 @@ >> #include "ovsdb-idl.h" >> #include "lib/ovn-l7.h" >> #include "lib/ovn-nb-idl.h" >> -#include "lib/ovn-parallel-hmap.h" >> #include "lib/ovn-sb-idl.h" >> #include "openvswitch/poll-loop.h" >> #include "simap.h" >> @@ -70,7 +69,6 @@ static const char *ssl_ca_cert_file; >> #define DEFAULT_PROBE_INTERVAL_MSEC 5000 >> static int northd_probe_interval_nb = 0; >> static int northd_probe_interval_sb = 0; >> -static bool use_parallel_build = true; >> >> static const char *rbac_chassis_auth[] = >> {"name"}; >> @@ -641,8 +639,6 @@ main(int argc, char *argv[]) >> >> daemonize_complete(); >> >> - use_parallel_build = can_parallelize_hashes(false); >> - >> /* We want to detect (almost) all changes to the ovn-nb db. */ >> struct ovsdb_idl_loop ovnnb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER( >> ovsdb_idl_create(ovnnb_db, &nbrec_idl_class, true, true)); >> @@ -905,23 +901,10 @@ main(int argc, char *argv[]) >> ovsdb_idl_track_add_column(ovnsb_idl_loop.idl, > &sbrec_fdb_col_dp_key); >> ovsdb_idl_track_add_column(ovnsb_idl_loop.idl, > &sbrec_fdb_col_port_key); >> >> - struct ovsdb_idl_index *sbrec_chassis_by_name >> - = chassis_index_create(ovnsb_idl_loop.idl); >> - >> - struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name >> - = ha_chassis_group_index_create(ovnsb_idl_loop.idl); >> - >> - struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp >> - = mcast_group_index_create(ovnsb_idl_loop.idl); >> - >> - struct ovsdb_idl_index *sbrec_ip_mcast_by_dp >> - = ip_mcast_index_create(ovnsb_idl_loop.idl); >> - >> unixctl_command_register("sb-connection-status", "", 0, 0, >> ovn_conn_show, ovnsb_idl_loop.idl); >> >> - char *ovn_internal_version = ovn_get_internal_version(); >> - VLOG_INFO("OVN internal version is : [%s]", ovn_internal_version); >> + VLOG_INFO("OVN internal version is : [%s]", > ovn_get_internal_version()); >> >> stopwatch_create(NORTHD_LOOP_STOPWATCH_NAME, SW_MS); >> stopwatch_create(OVNNB_DB_RUN_STOPWATCH_NAME, SW_MS); >> @@ -994,20 +977,12 @@ main(int argc, char *argv[]) >> } >> >> struct northd_idl_context ctx = { >> - .ovnnb_db = ovnnb_db, >> - .ovnsb_db = ovnsb_db, >> .ovnnb_idl = ovnnb_idl_loop.idl, >> .ovnnb_idl_loop = &ovnnb_idl_loop, >> .ovnnb_txn = ovnnb_txn, >> .ovnsb_idl = ovnsb_idl_loop.idl, >> .ovnsb_idl_loop = &ovnsb_idl_loop, >> .ovnsb_txn = ovnsb_txn, >> - .sbrec_chassis_by_name = sbrec_chassis_by_name, >> - .sbrec_ha_chassis_grp_by_name = > sbrec_ha_chassis_grp_by_name, >> - .sbrec_mcast_group_by_name_dp = > sbrec_mcast_group_by_name_dp, >> - .sbrec_ip_mcast_by_dp = sbrec_ip_mcast_by_dp, >> - .use_parallel_build = use_parallel_build, >> - .ovn_internal_version = ovn_internal_version, >> }; >> >> if (!state.had_lock && > ovsdb_idl_has_lock(ovnsb_idl_loop.idl)) { >> @@ -1107,7 +1082,6 @@ main(int argc, char *argv[]) >> } >> inc_proc_northd_cleanup(); >> >> - free(ovn_internal_version); >> unixctl_server_destroy(unixctl); >> ovsdb_idl_loop_destroy(&ovnnb_idl_loop); >> ovsdb_idl_loop_destroy(&ovnsb_idl_loop); >> -- >> 2.27.0 >> > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev