mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-28 07:40:02 +00:00
zebra: fix show route memory consumption
When displaying a route table in JSON, a table JSON object is storing all the prefix JSON objects containing the prefix information. This results in excessive memory allocation for JSON objects, potentially leading to an out-of-memory error on the machine with large routing tables. To Fix the memory consumption issue for the "show ip[v6] route [vrf XX] json" command, display the prefixes one by one and free the memory of each JSON object after it has been displayed. Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
parent
cb440058f2
commit
85eb60ffd6
@ -869,9 +869,9 @@ static void do_show_route_helper(struct vty *vty, struct zebra_vrf *zvrf,
|
||||
{
|
||||
struct route_node *rn;
|
||||
struct route_entry *re;
|
||||
bool first_json = true;
|
||||
int first = 1;
|
||||
rib_dest_t *dest;
|
||||
json_object *json = NULL;
|
||||
json_object *json_prefix = NULL;
|
||||
uint32_t addr;
|
||||
char buf[BUFSIZ];
|
||||
@ -887,9 +887,6 @@ static void do_show_route_helper(struct vty *vty, struct zebra_vrf *zvrf,
|
||||
* => display the VRF and table if specific
|
||||
*/
|
||||
|
||||
if (use_json)
|
||||
json = json_object_new_object();
|
||||
|
||||
/* Show all routes. */
|
||||
for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) {
|
||||
dest = rib_dest_from_rnode(rn);
|
||||
@ -962,17 +959,15 @@ static void do_show_route_helper(struct vty *vty, struct zebra_vrf *zvrf,
|
||||
|
||||
if (json_prefix) {
|
||||
prefix2str(&rn->p, buf, sizeof(buf));
|
||||
json_object_object_add(json, buf, json_prefix);
|
||||
vty_json_key(vty, buf, &first_json);
|
||||
vty_json_no_pretty(vty, json_prefix);
|
||||
|
||||
json_prefix = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This is an extremely expensive operation at scale
|
||||
* and non-pretty reduces memory footprint significantly.
|
||||
*/
|
||||
if (use_json)
|
||||
vty_json_no_pretty(vty, json);
|
||||
vty_json_close(vty, first_json);
|
||||
}
|
||||
|
||||
static void do_show_ip_route_all(struct vty *vty, struct zebra_vrf *zvrf,
|
||||
|
Loading…
Reference in New Issue
Block a user