Skip to content

Commit

Permalink
zebra: fix show route memory consumption
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
louis-6wind committed May 28, 2024
1 parent 36eb763 commit 5fe32b3
Showing 1 changed file with 5 additions and 10 deletions.
15 changes: 5 additions & 10 deletions zebra/zebra_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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);
Expand Down Expand Up @@ -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);
}

static void do_show_ip_route_all(struct vty *vty, struct zebra_vrf *zvrf,
Expand Down

0 comments on commit 5fe32b3

Please sign in to comment.