From 5b57b686984498eee09ce1a5f27eef6a14e4387e Mon Sep 17 00:00:00 2001 From: Mohit Agrawal Date: Wed, 6 Mar 2019 12:55:56 +0530 Subject: [PATCH 533/534] glusterd: glusterd memory leak while running "gluster v profile" in a loop Problem: glusterd has memory leak while running "gluster v profile" in a loop Solution: Resolve leak code path to avoid leak > Change-Id: Id608703ff6d0ad34ed8f921a5d25544e24cfadcd > fixes: bz#1685414 > Cherry pick from commit 9374484917466dff4688d96ff7faa0de1c804a6c > Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22301/ Change-Id: I874a0e9947913c201c67b78aaaa982d1fae78b46 BUG: 1684648 Signed-off-by: Mohit Agrawal Reviewed-on: https://code.engineering.redhat.com/gerrit/164609 Tested-by: RHGS Build Bot Reviewed-by: Sunil Kumar Heggodu Gopala Acharya --- xlators/mgmt/glusterd/src/glusterd-mgmt.c | 5 +++-- xlators/mgmt/glusterd/src/glusterd-syncop.c | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-mgmt.c index 275059c..e176288 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt.c @@ -1380,8 +1380,9 @@ out: if (rsp.op_errstr) free (rsp.op_errstr); - if (rsp.dict.dict_val) - free (rsp.dict.dict_val); + if (rsp_dict) + dict_unref (rsp_dict); + GF_FREE (peerid); /* req->rpc_status set to -1 means, STACK_DESTROY will be called from * the caller function. diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c index 7baef64..3b7fa8b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.c +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c @@ -1707,6 +1707,7 @@ gd_brick_op_phase (glusterd_op_t op, dict_t *op_ctx, dict_t *req_dict, char **op_errstr) { glusterd_pending_node_t *pending_node = NULL; + glusterd_pending_node_t *tmp = NULL; struct cds_list_head selected = {0,}; xlator_t *this = NULL; int brick_count = 0; @@ -1742,7 +1743,7 @@ gd_brick_op_phase (glusterd_op_t op, dict_t *op_ctx, dict_t *req_dict, rsp_dict = NULL; brick_count = 0; - cds_list_for_each_entry (pending_node, &selected, list) { + cds_list_for_each_entry_safe (pending_node, tmp, &selected, list) { rpc = glusterd_pending_node_get_rpc (pending_node); if (!rpc) { if (pending_node->type == GD_NODE_REBALANCE) { @@ -1792,6 +1793,7 @@ gd_brick_op_phase (glusterd_op_t op, dict_t *op_ctx, dict_t *req_dict, brick_count++; glusterd_pending_node_put_rpc (pending_node); + GF_FREE(pending_node); } pending_node = NULL; -- 1.8.3.1