bgpd: Optimizing route-map's processing of dependencies.

Say for eg., 256 prefix-list entries are pasted to VTYSH.
This results in BGP processing the events for several minutes.

BGPD starts a timer for 5 seconds when the first dependency configuraion
is received. On timer expiry, BGP process dependent route-maps.
After this processing, BGPD reads the configurations received in the
next 5 seconds and then re-processes the route-maps from the beginning.
This cyclic re-processing consumes time and CPU cycles.

Instead of starting a timer when the first configuration is received,
everytime a configuration is received, the existing timer is reset.
This would mean that all the configurations are read first before the timer
expires. This eliminates the cyclic re-processing.

Signed-off-by: NaveenThanikachalam nthanikachal@vmware.com
This commit is contained in:
Naveen Thanikachalam 2019-08-11 04:24:15 -07:00
parent ab0ef7a392
commit 47c8fa1f87

View File

@ -3406,31 +3406,34 @@ int bgp_route_map_update_timer(struct thread *thread)
static void bgp_route_map_mark_update(const char *rmap_name) static void bgp_route_map_mark_update(const char *rmap_name)
{ {
if (bm->t_rmap_update == NULL) { struct listnode *node, *nnode;
struct listnode *node, *nnode; struct bgp *bgp;
struct bgp *bgp;
/* rmap_update_timer of 0 means don't do route updates */ /* If new update is received before the current timer timed out,
if (bm->rmap_update_timer) { * turn it off and start a new timer.
bm->t_rmap_update = NULL; */
thread_add_timer(bm->master, bgp_route_map_update_timer, if (bm->t_rmap_update != NULL)
NULL, bm->rmap_update_timer, THREAD_OFF(bm->t_rmap_update);
&bm->t_rmap_update);
/* Signal the groups that a route-map update event has /* rmap_update_timer of 0 means don't do route updates */
* started */ if (bm->rmap_update_timer) {
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) thread_add_timer(bm->master, bgp_route_map_update_timer,
update_group_policy_update(bgp, NULL, bm->rmap_update_timer,
BGP_POLICY_ROUTE_MAP, &bm->t_rmap_update);
rmap_name, 1, 1);
} else { /* Signal the groups that a route-map update event has
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) * started */
bgp_route_map_process_update(bgp, rmap_name, 0); for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
update_group_policy_update(bgp,
BGP_POLICY_ROUTE_MAP,
rmap_name, 1, 1);
} else {
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
bgp_route_map_process_update(bgp, rmap_name, 0);
#if ENABLE_BGP_VNC #if ENABLE_BGP_VNC
zlog_debug("%s: calling vnc_routemap_update", __func__); zlog_debug("%s: calling vnc_routemap_update", __func__);
vnc_routemap_update(bgp, __func__); vnc_routemap_update(bgp, __func__);
#endif #endif
}
} }
} }