]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: fix show route memory consumption
authorLouis Scalbert <louis.scalbert@6wind.com>
Fri, 24 May 2024 14:34:23 +0000 (16:34 +0200)
committerLouis Scalbert <louis.scalbert@6wind.com>
Fri, 7 Jun 2024 08:13:32 +0000 (10:13 +0200)
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>
zebra/zebra_vty.c

index 97245d55b9eb8e101bb40ddf79a88bcf83dafb3b..c31218a7c367487d90eaf122d0f01eb5c028d303 100644 (file)
@@ -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,