When there is a big number of ha_chassis_groups (e.g. for distributed gateway ports), the calculation of ha_ref_chassis can take the major part of ovn-northd CPU as shown in perf.
However, when there is only one chassis in ha_chassis_group, no BFD sessions are needed, so ha_ref_chassis calculation is unnecessary. Signed-off-by: Han Zhou <[email protected]> --- TODO: DDlog changes --- northd/ovn-northd.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c index 87c4478fa..2bc187d39 100644 --- a/northd/ovn-northd.c +++ b/northd/ovn-northd.c @@ -6488,7 +6488,8 @@ build_lrouter_groups__(struct hmap *ports, struct ovn_datapath *od) * ha chassis group name. */ for (size_t i = 0; i < od->n_l3dgw_ports; i++) { struct ovn_port *crp = od->l3dgw_ports[i]->cr_port; - if (crp->sb->ha_chassis_group) { + if (crp->sb->ha_chassis_group && + crp->sb->ha_chassis_group->n_ha_chassis > 1) { sset_add(&od->lr_group->ha_chassis_groups, crp->sb->ha_chassis_group->name); } @@ -14163,11 +14164,13 @@ handle_port_binding_changes(struct northd_context *ctx, struct hmap *ports, if (ctx->ovnsb_txn) { const struct sbrec_ha_chassis_group *ha_ch_grp; SBREC_HA_CHASSIS_GROUP_FOR_EACH (ha_ch_grp, ctx->ovnsb_idl) { - struct ha_ref_chassis_info *ref_ch_info = - xzalloc(sizeof *ref_ch_info); - ref_ch_info->ha_chassis_group = ha_ch_grp; - build_ha_chassis_ref = true; - shash_add(ha_ref_chassis_map, ha_ch_grp->name, ref_ch_info); + if (ha_ch_grp->n_ha_chassis > 1) { + struct ha_ref_chassis_info *ref_ch_info = + xzalloc(sizeof *ref_ch_info); + ref_ch_info->ha_chassis_group = ha_ch_grp; + build_ha_chassis_ref = true; + shash_add(ha_ref_chassis_map, ha_ch_grp->name, ref_ch_info); + } } } -- 2.30.2 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
