From d4b0360c8c4c5dab692f827972ccea0e728af688 Mon Sep 17 00:00:00 2001 From: Pranith K Date: Fri, 8 Oct 2010 01:37:54 +0000 Subject: mgmt/glusterd: memory leak fixes Signed-off-by: Pranith Kumar K Signed-off-by: Vijay Bellur BUG: 1726 () URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1726 --- xlators/mgmt/glusterd/src/glusterd-handler.c | 2 +- xlators/mgmt/glusterd/src/glusterd-handshake.c | 2 +- xlators/mgmt/glusterd/src/glusterd-op-sm.c | 18 +++++++++++++++--- xlators/mgmt/glusterd/src/glusterd-sm.c | 23 ++++------------------- xlators/mgmt/glusterd/src/glusterd-sm.h | 2 ++ xlators/mgmt/glusterd/src/glusterd-utils.c | 2 ++ 6 files changed, 25 insertions(+), 24 deletions(-) (limited to 'xlators') diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 57239c6266d..e22f0e40394 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -321,7 +321,7 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo, ret = -1; goto out; } - + pairs = dict->members_list; if (!pairs) { ret = -1; diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index fbc25d1c602..213bcc6fb48 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -164,7 +164,7 @@ server_getspec (rpcsvc_request_t *req) } if (file_len) { - rsp.spec = CALLOC (file_len, sizeof (char)); + rsp.spec = CALLOC (file_len+1, sizeof (char)); if (!rsp.spec) { ret = -1; op_errno = ENOMEM; diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 4ae7afcc39d..d9d324b2e1e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -440,12 +440,15 @@ glusterd_op_stage_create_volume (gd1_mgmt_stage_op_req *req, char **op_errstr) brick_list = tmpptr; } glusterd_brickinfo_delete (brick_info); + brick_info = NULL; } out: if (dict) dict_unref (dict); if (free_ptr) GF_FREE (free_ptr); + if (brick_info) + glusterd_brickinfo_delete (brick_info); gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; @@ -695,6 +698,7 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr) char cmd_str[1024]; glusterd_conf_t *priv = NULL; char msg[2048] = {0,}; + gf_boolean_t brick_alloc = _gf_false; GF_ASSERT (req); @@ -755,19 +759,21 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr) brick = strtok_r (brick_list+1, " \n", &saveptr); while ( i < count) { - ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo, &brickinfo); + ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo, + &brickinfo); if (!ret) { gf_log ("", GF_LOG_ERROR, "Adding duplicate brick: %s", brick); ret = -1; goto out; } else { - ret = glusterd_brickinfo_from_brick(brick, &brickinfo); + ret = glusterd_brickinfo_from_brick (brick, &brickinfo); if (ret) { gf_log ("", GF_LOG_ERROR, "Add-brick: Unable" " to get brickinfo"); goto out; } + brick_alloc = _gf_true; } snprintf (cmd_str, 1024, "%s", brickinfo->path); ret = glusterd_resolve_brick (brickinfo); @@ -802,6 +808,8 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr) } glusterd_brickinfo_delete (brickinfo); + brick_alloc = _gf_false; + brickinfo = NULL; brick = strtok_r (NULL, " \n", &saveptr); i++; } @@ -811,6 +819,9 @@ out: dict_unref (dict); if (free_ptr) GF_FREE (free_ptr); + if (brick_alloc && brickinfo) + glusterd_brickinfo_delete (brickinfo); + gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; @@ -1436,7 +1447,8 @@ glusterd_op_perform_add_bricks (glusterd_volinfo_t *volinfo, int32_t count, while (i <= count) { - ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo, &brickinfo); + ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo, + &brickinfo); if (ret) goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c index 051bdee91be..6061d0276f2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-sm.c @@ -129,10 +129,9 @@ glusterd_broadcast_friend_delete (char *hostname, uuid_t uuid) { int ret = 0; rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; glusterd_conf_t *conf = NULL; xlator_t *this = NULL; - glusterd_friend_update_ctx_t *ctx = NULL; + glusterd_friend_update_ctx_t ctx = {{0},}; this = THIS; conf = this->private; @@ -140,27 +139,13 @@ glusterd_broadcast_friend_delete (char *hostname, uuid_t uuid) GF_ASSERT (conf); GF_ASSERT (conf->mgmt); - ctx = GF_CALLOC (1, sizeof (*ctx), - gf_gld_mt_friend_update_ctx_t); - - if (!ctx) { - ret = -1; - goto out; - } - - ctx->hostname = gf_strdup (hostname); - ctx->op = GD_FRIEND_UPDATE_DEL; + ctx.hostname = hostname; + ctx.op = GD_FRIEND_UPDATE_DEL; proc = &conf->mgmt->proctable[GD_MGMT_FRIEND_UPDATE]; if (proc->fn) { - frame = create_frame (this, this->ctx->pool); - if (!frame) { - goto out; - } - frame->local = ctx; - ret = proc->fn (frame, this, ctx); + ret = proc->fn (NULL, this, &ctx); } -out: gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); return ret; diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.h b/xlators/mgmt/glusterd/src/glusterd-sm.h index 5828f05e34e..8e8c2ea7f09 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.h +++ b/xlators/mgmt/glusterd/src/glusterd-sm.h @@ -182,4 +182,6 @@ glusterd_friend_sm_state_name_get (glusterd_friend_sm_state_t state); int glusterd_broadcast_friend_delete (char *hostname, uuid_t uuid); +void +glusterd_destroy_friend_update_ctx (glusterd_friend_update_ctx_t *ctx); #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index c7018cde86f..11a19d2a25e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1575,6 +1575,8 @@ glusterd_import_friend_volume (dict_t *vols, int count) list_for_each_entry_safe (brickinfo, tmp, &volinfo->bricks, brick_list) { + glusterd_delete_volfile (volinfo, brickinfo); + glusterd_store_delete_brick (volinfo, brickinfo); ret = glusterd_brickinfo_delete (brickinfo); if (ret) goto out; -- cgit