d1681e
From eadd7e7168349705b29bc6ae9f99ba3e6ae58060 Mon Sep 17 00:00:00 2001
d1681e
From: Sanju Rakonde <srakonde@redhat.com>
d1681e
Date: Mon, 16 Jul 2018 15:59:36 +0530
d1681e
Subject: [PATCH 326/333] glusterd: memory leak in get-state
d1681e
d1681e
Problem: gluster get-state command is leaking the memory when
d1681e
geo-replication session is configured.
d1681e
d1681e
Cause: In glusterd_print_gsync_status(), we are trying to get
d1681e
reference to the keys of gsync_dict. The references to keys of
d1681e
gsync_dict are stored status_vols[i]. status_vols[i] are
d1681e
allocated with a memory of size of gf_gsync_status_t.
d1681e
d1681e
Solution: Need not to use a array of pointers(status_vals), using
d1681e
a pointer to hold the reference to a key of gsync_dict is sufficient.
d1681e
d1681e
Followed the below steps for testing:
d1681e
1. Configured geo-rep session
d1681e
2. Ran gluster get-state command for 1000 times.
d1681e
d1681e
Without this patch, glusterd's memory was increasing significantly
d1681e
(around 22000KB per 1000 times), with this patch it reduced (1500KB
d1681e
per 1000 times)
d1681e
d1681e
>fixes: bz#1601423
d1681e
>Change-Id: I361f5525d71f821bb345419ccfdc20ca288ca292
d1681e
>Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
d1681e
d1681e
upstream patch: https://review.gluster.org/#/c/20521/
d1681e
d1681e
Change-Id: I361f5525d71f821bb345419ccfdc20ca288ca292
d1681e
BUG: 1599362
d1681e
Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/144325
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Mohit Agrawal <moagrawa@redhat.com>
d1681e
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
d1681e
---
d1681e
 xlators/mgmt/glusterd/src/glusterd-handler.c | 53 ++++++++++------------------
d1681e
 1 file changed, 19 insertions(+), 34 deletions(-)
d1681e
d1681e
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
d1681e
index 395b342..861ff17 100644
d1681e
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
d1681e
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
d1681e
@@ -5082,7 +5082,7 @@ glusterd_print_gsync_status (FILE *fp, dict_t *gsync_dict)
d1681e
         int                     ret = -1;
d1681e
         int                     gsync_count = 0;
d1681e
         int                     i = 0;
d1681e
-        gf_gsync_status_t       **status_vals = NULL;
d1681e
+        gf_gsync_status_t       *status_vals = NULL;
d1681e
         char                    status_val_name[PATH_MAX] = {0,};
d1681e
 
d1681e
         GF_VALIDATE_OR_GOTO (THIS->name, fp, out);
d1681e
@@ -5097,62 +5097,47 @@ glusterd_print_gsync_status (FILE *fp, dict_t *gsync_dict)
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
-        status_vals = GF_CALLOC (gsync_count, sizeof (gf_gsync_status_t *),
d1681e
-                                 gf_common_mt_char);
d1681e
-        if (!status_vals) {
d1681e
-                ret = -1;
d1681e
-                goto out;
d1681e
-        }
d1681e
-        for (i = 0; i < gsync_count; i++) {
d1681e
-                status_vals[i] = GF_CALLOC (1, sizeof (gf_gsync_status_t),
d1681e
-                                            gf_common_mt_char);
d1681e
-                if (!status_vals[i]) {
d1681e
-                        ret = -1;
d1681e
-                        goto out;
d1681e
-                }
d1681e
-        }
d1681e
-
d1681e
         for (i = 0; i < gsync_count; i++) {
d1681e
                 snprintf (status_val_name, sizeof(status_val_name), "status_value%d", i);
d1681e
 
d1681e
-                ret = dict_get_bin (gsync_dict, status_val_name, (void **)&(status_vals[i]));
d1681e
+                ret = dict_get_bin (gsync_dict, status_val_name, (void **)&(status_vals));
d1681e
                 if (ret)
d1681e
                         goto out;
d1681e
 
d1681e
                 fprintf (fp, "Volume%d.pair%d.session_slave: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(21, status_vals[i]));
d1681e
+                         get_struct_variable(21, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.master_node: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(0, status_vals[i]));
d1681e
+                         get_struct_variable(0, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.master_volume: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(1, status_vals[i]));
d1681e
+                         get_struct_variable(1, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.master_brick: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(2, status_vals[i]));
d1681e
+                         get_struct_variable(2, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.slave_user: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(3, status_vals[i]));
d1681e
+                         get_struct_variable(3, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.slave: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(4, status_vals[i]));
d1681e
+                         get_struct_variable(4, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.slave_node: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(5, status_vals[i]));
d1681e
+                         get_struct_variable(5, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.status: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(6, status_vals[i]));
d1681e
+                         get_struct_variable(6, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.crawl_status: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(7, status_vals[i]));
d1681e
+                         get_struct_variable(7, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.last_synced: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(8, status_vals[i]));
d1681e
+                         get_struct_variable(8, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.entry: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(9, status_vals[i]));
d1681e
+                         get_struct_variable(9, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.data: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(10, status_vals[i]));
d1681e
+                         get_struct_variable(10, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.meta: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(11, status_vals[i]));
d1681e
+                         get_struct_variable(11, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.failures: %s\n", volcount, i+1,
d1681e
-                         get_struct_variable(12, status_vals[i]));
d1681e
+                         get_struct_variable(12, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.checkpoint_time: %s\n", volcount,
d1681e
-                         i+1, get_struct_variable(13, status_vals[i]));
d1681e
+                         i+1, get_struct_variable(13, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.checkpoint_completed: %s\n",
d1681e
-                         volcount, i+1, get_struct_variable(14, status_vals[i]));
d1681e
+                         volcount, i+1, get_struct_variable(14, status_vals));
d1681e
                 fprintf (fp, "Volume%d.pair%d.checkpoint_completion_time: %s\n",
d1681e
-                         volcount, i+1, get_struct_variable(15, status_vals[i]));
d1681e
+                         volcount, i+1, get_struct_variable(15, status_vals));
d1681e
         }
d1681e
 out:
d1681e
         return ret;
d1681e
-- 
d1681e
1.8.3.1
d1681e