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