The route_policies_lookup() function does an extensive comparison of route policy fields in order to determine if a match already exists in the route_policies hmap.
The problem is that none of this is necessary. The hash we pass to this function is based on the logical router's UUID. This means we are only looking at route policies for the current logical router. All route policy fields will always be the same if the Logical Router Policy and Logical Router are the same. This commit changes route_policies_lookup() to only check if the Logical Router Policy matches. This way, we can perform the lookup early when building route policies, and abandon our processing if this policy has already been created for this logical router. Signed-off-by: Mark Michelson <[email protected]> --- northd/en-route-policies.c | 53 ++++++-------------------------------- 1 file changed, 8 insertions(+), 45 deletions(-) diff --git a/northd/en-route-policies.c b/northd/en-route-policies.c index fd2025294..8b53714db 100644 --- a/northd/en-route-policies.c +++ b/northd/en-route-policies.c @@ -26,43 +26,11 @@ VLOG_DEFINE_THIS_MODULE(en_route_policies); static struct route_policy * route_policies_lookup(struct hmap *route_policies, size_t hash, - struct route_policy *new_rp) + const struct nbrec_logical_router_policy *rule) { struct route_policy *rp; HMAP_FOR_EACH_WITH_HASH (rp, key_node, hash, route_policies) { - if (rp->rule != new_rp->rule) { - continue; - } - - if (rp->chain_id != new_rp->chain_id) { - continue; - } - - if (rp->jump_chain_id != new_rp->jump_chain_id) { - continue; - } - - if (rp->n_valid_nexthops != new_rp->n_valid_nexthops) { - continue; - } - - size_t i; - for (i = 0; i < new_rp->n_valid_nexthops; i++) { - size_t j; - - for (j = 0; j < rp->n_valid_nexthops; j++) { - if (!strcmp(new_rp->valid_nexthops[i], - rp->valid_nexthops[j])) { - break; - } - } - - if (j == rp->n_valid_nexthops) { - break; - } - } - - if (i == new_rp->n_valid_nexthops) { + if (rp->rule == rule) { return rp; } } @@ -161,8 +129,6 @@ build_route_policies(struct ovn_datapath *od, struct hmap *bfd_active_connections, struct simap *chain_ids) { - struct route_policy *rp; - /* Create chain numeric ids for policies with chain name set */ for (int i = 0; i < od->nbr->n_policies; i++) { const struct nbrec_logical_router_policy *rule = od->nbr->policies[i]; @@ -173,9 +139,14 @@ build_route_policies(struct ovn_datapath *od, } } + size_t hash = uuid_hash(&od->key); for (int i = 0; i < od->nbr->n_policies; i++) { const struct nbrec_logical_router_policy *rule = od->nbr->policies[i]; + if (route_policies_lookup(route_policies, hash, rule)) { + continue; + } + size_t n_valid_nexthops = 0; char **valid_nexthops = NULL; uint32_t chain_id = 0; @@ -296,15 +267,7 @@ build_route_policies(struct ovn_datapath *od, new_rp->valid_nexthops = valid_nexthops; new_rp->chain_id = chain_id; new_rp->jump_chain_id = jump_chain_id; - - size_t hash = uuid_hash(&od->key); - rp = route_policies_lookup(route_policies, hash, new_rp); - if (!rp) { - hmap_insert(route_policies, &new_rp->key_node, hash); - } else { - free(valid_nexthops); - free(new_rp); - } + hmap_insert(route_policies, &new_rp->key_node, hash); } } -- 2.55.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
