From ee7f340f73eb2b61d5d1f6b881eede3b39432c9f Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Thu, 2 Sep 2010 07:06:47 +0000 Subject: mgmt/glusterd: memory leak fixes Signed-off-by: Pranith Kumar K Signed-off-by: Vijay Bellur BUG: 1186 () URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1186 --- xlators/mgmt/glusterd/src/glusterd-handler.c | 21 +++++----- xlators/mgmt/glusterd/src/glusterd-op-sm.c | 61 ++++++++++++++++++++++++++++ xlators/mgmt/glusterd/src/glusterd-sm.c | 51 +++++++++++++++++++++++ xlators/mgmt/glusterd/src/glusterd-sm.h | 5 +++ xlators/mgmt/glusterd/src/glusterd-utils.c | 2 + xlators/mgmt/glusterd/src/glusterd3_1-mops.c | 11 +++-- 6 files changed, 138 insertions(+), 13 deletions(-) (limited to 'xlators/mgmt/glusterd/src') diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index c55de40b1..601546ba6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -392,7 +392,7 @@ glusterd_handle_cluster_lock (rpcsvc_request_t *req) "Received LOCK from uuid: %s", str); - ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_op_stage_ctx_t); + ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_op_lock_ctx_t); if (!ctx) { //respond here @@ -1096,6 +1096,8 @@ glusterd_handle_create_volume (rpcsvc_request_t *req) i++; brick= strtok_r (brick_list, " \n", &tmpptr); brick_list = tmpptr; + if (brickinfo) + glusterd_brickinfo_delete (brickinfo); ret = glusterd_brickinfo_from_brick (brick, &brickinfo); if (ret) goto out; @@ -1160,6 +1162,8 @@ out: ((ret || err_ret) != 0) ? "FAILED": "SUCCESS"); if (free_ptr) GF_FREE(free_ptr); + if (brickinfo) + glusterd_brickinfo_delete (brickinfo); return ret; } @@ -1358,6 +1362,8 @@ brick_val: i++; brick= strtok_r (brick_list, " \n", &tmpptr); brick_list = tmpptr; + if (brickinfo) + glusterd_brickinfo_delete (brickinfo); ret = glusterd_brickinfo_from_brick (brick, &brickinfo); if (ret) goto out; @@ -1419,6 +1425,8 @@ out: } gf_cmd_log ("Volume add-brick","on volname %s %s", volname, ((ret || err_ret) != 0)? "FAILED" : "SUCCESS"); + if (brickinfo) + glusterd_brickinfo_delete (brickinfo); return ret; } @@ -1742,7 +1750,6 @@ glusterd_handle_log_locate (rpcsvc_request_t *req) int32_t ret = -1; gf1_cli_log_locate_req cli_req = {0,}; gf1_cli_log_locate_rsp rsp = {0,}; - dict_t *dict = NULL; glusterd_conf_t *priv = NULL; glusterd_volinfo_t *volinfo = NULL; glusterd_brickinfo_t *brickinfo = NULL; @@ -1761,10 +1768,6 @@ glusterd_handle_log_locate (rpcsvc_request_t *req) gf_log ("glusterd", GF_LOG_NORMAL, "Received log locate req " "for volume %s", cli_req.volname); - dict = dict_new (); - if (!dict) - goto out; - if (strchr (cli_req.brick, ':')) { /* TODO: need to get info of only that brick and then tell what is the exact location */ @@ -2808,10 +2811,8 @@ glusterd_list_friends (rpcsvc_request_t *req, dict_t *dict, int32_t flags) ret = 0; out: - if (ret) { - if (friends) - dict_unref (friends); - } + if (friends) + dict_unref (friends); rsp.op_ret = ret; diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 330d8e6d2..fe3a3abd2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -54,6 +54,36 @@ static struct list_head gd_op_sm_queue; glusterd_op_info_t opinfo = {{0},}; static int glusterfs_port = GLUSTERD_DEFAULT_PORT; +void +glusterd_destroy_lock_ctx (glusterd_op_lock_ctx_t *ctx) +{ + if (!ctx) + return; + GF_FREE (ctx); +} + +void +glusterd_destroy_stage_ctx (glusterd_op_stage_ctx_t *ctx) +{ + if (!ctx) + return; + + if (ctx->stage_req.buf.buf_val) + GF_FREE (ctx->stage_req.buf.buf_val); + GF_FREE (ctx); +} + +void +glusterd_destroy_commit_ctx (glusterd_op_commit_ctx_t *ctx) +{ + if (!ctx) + return; + + if (ctx->stage_req.buf.buf_val) + GF_FREE (ctx->stage_req.buf.buf_val); + GF_FREE (ctx); +} + static void glusterd_set_volume_status (glusterd_volinfo_t *volinfo, glusterd_volume_status status) @@ -876,6 +906,8 @@ glusterd_op_stage_log_rotate (gd1_mgmt_stage_op_req *req) } out: + if (dict) + dict_unref (dict); gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; @@ -2372,6 +2404,8 @@ glusterd_op_log_filename (gd1_mgmt_stage_op_req *req) ret = 0; out: + if (dict) + dict_unref (dict); return ret; } @@ -2478,6 +2512,8 @@ glusterd_op_log_rotate (gd1_mgmt_stage_op_req *req) ret = 0; out: + if (dict) + dict_unref (dict); return ret; } @@ -3407,6 +3443,27 @@ out: return ret; } +void +glusterd_destroy_op_event_ctx (glusterd_op_sm_event_t *event) +{ + if (!event) + return; + + switch (event->event) { + case GD_OP_EVENT_LOCK: + case GD_OP_EVENT_UNLOCK: + glusterd_destroy_lock_ctx (event->ctx); + break; + case GD_OP_EVENT_STAGE_OP: + glusterd_destroy_stage_ctx (event->ctx); + break; + case GD_OP_EVENT_COMMIT_OP: + glusterd_destroy_commit_ctx (event->ctx); + break; + default: + break; + } +} int glusterd_op_sm () @@ -3438,6 +3495,7 @@ glusterd_op_sm () if (ret) { gf_log ("glusterd", GF_LOG_ERROR, "handler returned: %d", ret); + glusterd_destroy_op_event_ctx (event); GF_FREE (event); continue; } @@ -3454,6 +3512,7 @@ glusterd_op_sm () return ret; } + glusterd_destroy_op_event_ctx (event); GF_FREE (event); } } @@ -3600,6 +3659,8 @@ glusterd_op_clear_ctx (glusterd_op_t op) case GD_OP_ADD_BRICK: case GD_OP_REMOVE_BRICK: case GD_OP_REPLACE_BRICK: + case GD_OP_LOG_FILENAME: + case GD_OP_LOG_ROTATE: dict_unref (ctx); break; case GD_OP_DELETE_VOLUME: diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c index 3eaa8ffef..2be2de4d2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-sm.c @@ -46,6 +46,33 @@ static struct list_head gd_friend_sm_queue; +void +glusterd_destroy_probe_ctx (glusterd_probe_ctx_t *ctx) +{ + if (!ctx) + return; + + if (ctx->hostname) + GF_FREE (ctx->hostname); + GF_FREE (ctx); +} + +void +glusterd_destroy_friend_req_ctx (glusterd_friend_req_ctx_t *ctx) +{ + if (!ctx) + return; + + if (ctx->vols) + dict_unref (ctx->vols); + if (ctx->hostname) + GF_FREE (ctx->hostname); + GF_FREE (ctx); +} + +#define glusterd_destroy_friend_update_ctx(ctx)\ + glusterd_destroy_friend_req_ctx(ctx) + static int glusterd_ac_none (glusterd_friend_sm_event_t *event, void *ctx) { @@ -543,6 +570,27 @@ glusterd_friend_sm_inject_event (glusterd_friend_sm_event_t *event) return 0; } +void +glusterd_destroy_friend_event_context (glusterd_friend_sm_event_t *event) +{ + if (!event) + return; + + switch (event->event) { + case GD_FRIEND_EVENT_RCVD_FRIEND_REQ: + case GD_FRIEND_EVENT_RCVD_REMOVE_FRIEND: + glusterd_destroy_friend_req_ctx (event->ctx); + break; + case GD_FRIEND_EVENT_LOCAL_ACC: + case GD_FRIEND_EVENT_LOCAL_RJT: + case GD_FRIEND_EVENT_RCVD_ACC: + case GD_FRIEND_EVENT_RCVD_RJT: + glusterd_destroy_friend_update_ctx(event->ctx); + break; + default: + break; + } +} int glusterd_friend_sm () @@ -594,12 +642,14 @@ glusterd_friend_sm () if (ret) { gf_log ("glusterd", GF_LOG_ERROR, "handler returned: " "%d", ret); + glusterd_destroy_friend_event_context (event); GF_FREE (event); continue; } if ((GD_FRIEND_EVENT_REMOVE_FRIEND == event_type) || (GD_FRIEND_EVENT_INIT_REMOVE_FRIEND == event_type)){ + glusterd_destroy_friend_event_context (event); GF_FREE (event); continue; } @@ -615,6 +665,7 @@ glusterd_friend_sm () ret = glusterd_store_update_peerinfo (peerinfo); + glusterd_destroy_friend_event_context (event); GF_FREE (event); } } diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.h b/xlators/mgmt/glusterd/src/glusterd-sm.h index 6490f3d52..2bd2601cb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.h +++ b/xlators/mgmt/glusterd/src/glusterd-sm.h @@ -146,4 +146,9 @@ glusterd_friend_sm_init (); int glusterd_friend_sm (); +void +glusterd_destroy_probe_ctx (glusterd_probe_ctx_t *ctx); + +void +glusterd_destroy_friend_req_ctx (glusterd_friend_req_ctx_t *ctx); #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 8ae2b0392..4d9834adb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -943,6 +943,8 @@ glusterd_peer_destroy (glusterd_peerinfo_t *peerinfo) } list_del_init (&peerinfo->hostnames); + if (peerinfo->hostname) + GF_FREE (peerinfo->hostname); GF_FREE (peerinfo); peerinfo = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd3_1-mops.c b/xlators/mgmt/glusterd/src/glusterd3_1-mops.c index 3f7db7e5b..0376f4be1 100644 --- a/xlators/mgmt/glusterd/src/glusterd3_1-mops.c +++ b/xlators/mgmt/glusterd/src/glusterd3_1-mops.c @@ -93,8 +93,7 @@ glusterd3_1_probe_cbk (struct rpc_req *req, struct iovec *iov, glusterd_peer_hostname_new (rsp.hostname, &name); list_add_tail (&name->hostname_list, &peerinfo->hostnames); peerinfo->rpc = dup_peerinfo->rpc; - list_del_init (&dup_peerinfo->uuid_list); - GF_FREE (dup_peerinfo); + glusterd_peer_destroy (dup_peerinfo); } if (!peerinfo->hostname) peerinfo->hostname = gf_strdup (rsp.hostname); @@ -111,6 +110,7 @@ glusterd3_1_probe_cbk (struct rpc_req *req, struct iovec *iov, event->peerinfo = peerinfo; event->ctx = ((call_frame_t *)myframe)->local; + ((call_frame_t *)myframe)->local = NULL; ret = glusterd_friend_sm_inject_event (event); @@ -203,6 +203,7 @@ glusterd3_1_friend_add_cbk (struct rpc_req * req, struct iovec *iov, goto out; ctx = ((call_frame_t *)myframe)->local; + ((call_frame_t *)myframe)->local = NULL; GF_ASSERT (ctx); @@ -212,7 +213,8 @@ glusterd3_1_friend_add_cbk (struct rpc_req * req, struct iovec *iov, glusterd_friend_sm (); glusterd_op_sm (); } - + if (ctx) + glusterd_destroy_probe_ctx (ctx); out: return ret; } @@ -236,6 +238,7 @@ glusterd3_1_friend_remove_cbk (struct rpc_req * req, struct iovec *iov, GF_ASSERT (conf); ctx = ((call_frame_t *)myframe)->local; + ((call_frame_t *)myframe)->local = NULL; GF_ASSERT (ctx); if (-1 == req->rpc_status) { @@ -289,6 +292,8 @@ inject: glusterd_friend_sm (); glusterd_op_sm (); + if (ctx) + glusterd_destroy_probe_ctx (ctx); op_ret = 0; -- cgit