From 4ee093305a0237368118e425723792a028b02a94 Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Thu, 15 Sep 2011 17:09:00 +0530 Subject: glusterd: profile cmd incorrectly reports all bricks down. If there are no bricks of a volume running 'local' to glusterd where the 'profile info' command is issued, glusterd incorrectly reports that all bricks of the volume are down. Change-Id: Idd703c991f0bcf59b76b9ef8f4ad8cd71960a55b BUG: 3553 Reviewed-on: http://review.gluster.com/430 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/mgmt/glusterd/src/glusterd-handler.c | 2 +- xlators/mgmt/glusterd/src/glusterd-op-sm.c | 38 ++++++++++------------------ xlators/mgmt/glusterd/src/glusterd-op-sm.h | 2 +- xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 7 ++--- 4 files changed, 19 insertions(+), 30 deletions(-) (limited to 'xlators/mgmt') diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 2f486dac..df0aa202 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -615,7 +615,7 @@ glusterd_handle_commit_op (rpcsvc_request_t *req) ret = glusterd_op_sm_inject_event (GD_OP_EVENT_COMMIT_OP, req_ctx); if (ret) goto out; - ret = glusterd_op_init_ctx (); + ret = glusterd_op_init_ctx (op_req.op); out: if (op_req.buf.buf_val) diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index b9d4606c..14c9566a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -2094,12 +2094,12 @@ glusterd_op_ac_stage_op (glusterd_op_sm_event_t *event, void *ctx) } static gf_boolean_t -glusterd_need_brick_op () +glusterd_need_brick_op (glusterd_op_t op) { gf_boolean_t ret = _gf_false; - glusterd_op_t op = GD_OP_NONE; - op = glusterd_op_get_op (); + GF_ASSERT (GD_OP_NONE < op && op < GD_OP_MAX); + switch (op) { case GD_OP_PROFILE_VOLUME: ret = _gf_true; @@ -2112,13 +2112,14 @@ glusterd_need_brick_op () } static dict_t* -glusterd_op_init_commit_rsp_dict () +glusterd_op_init_commit_rsp_dict (glusterd_op_t op) { dict_t *rsp_dict = NULL; dict_t *op_ctx = NULL; + GF_ASSERT (GD_OP_NONE < op && op < GD_OP_MAX); - if (glusterd_need_brick_op ()) { + if (glusterd_need_brick_op (op)) { op_ctx = glusterd_op_get_ctx (); GF_ASSERT (op_ctx); rsp_dict = dict_ref (op_ctx); @@ -2145,7 +2146,7 @@ glusterd_op_ac_commit_op (glusterd_op_sm_event_t *event, void *ctx) dict = req_ctx->dict; - rsp_dict = glusterd_op_init_commit_rsp_dict (); + rsp_dict = glusterd_op_init_commit_rsp_dict (req_ctx->op); if (NULL == rsp_dict) return -1; status = glusterd_op_commit_perform (req_ctx->op, dict, &op_errstr, @@ -2600,7 +2601,6 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr) glusterd_brickinfo_t *brickinfo = NULL; glusterd_pending_node_t *pending_node = NULL; char *brick = NULL; - int all_bricks_down = 0; this = THIS; GF_ASSERT (this); @@ -2635,10 +2635,8 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr) goto out; break; case GF_CLI_STATS_INFO: - all_bricks_down = 1; list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { if (glusterd_is_brick_started (brickinfo)) { - all_bricks_down = 0; pending_node = GF_CALLOC (1, sizeof (*pending_node), gf_gld_mt_pending_node_t); if (!pending_node) { @@ -2655,7 +2653,6 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr) break; case GF_CLI_STATS_TOP: - all_bricks_down = 1; ret = dict_get_str (dict, "brick", &brick); if (!ret) { ret = glusterd_volume_brickinfo_get_by_brick (brick, @@ -2663,12 +2660,8 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr) if (ret) goto out; - if (!glusterd_is_brick_started (brickinfo)) { - ret = -1; + if (!glusterd_is_brick_started (brickinfo)) goto out; - } else { - all_bricks_down = 0; - } pending_node = GF_CALLOC (1, sizeof (*pending_node), gf_gld_mt_pending_node_t); @@ -2686,7 +2679,6 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr) ret = 0; list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { if (glusterd_is_brick_started (brickinfo)) { - all_bricks_down = 0; pending_node = GF_CALLOC (1, sizeof (*pending_node), gf_gld_mt_pending_node_t); if (!pending_node) { @@ -2713,10 +2705,6 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr) out: - if (all_bricks_down) { - ret = -1; - *op_errstr = gf_strdup ("Cannot reach bricks. Bricks are down"); - } gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; @@ -2908,7 +2896,7 @@ glusterd_op_sm_t glusterd_op_state_stage_op_sent [] = { {GD_OP_STATE_STAGE_OP_SENT, glusterd_op_ac_none},//EVENT_START_LOCK {GD_OP_STATE_STAGE_OP_SENT, glusterd_op_ac_lock}, //EVENT_LOCK {GD_OP_STATE_STAGE_OP_SENT, glusterd_op_ac_rcvd_stage_op_acc}, //EVENT_RCVD_ACC - {GD_OP_STATE_BRICK_OP_SENT, glusterd_op_ac_send_brick_op}, //EVENT_ALL_ACC + {GD_OP_STATE_BRICK_OP_SENT, glusterd_op_ac_send_brick_op}, //EVENT_ALL_ACC {GD_OP_STATE_BRICK_OP_SENT, glusterd_op_ac_send_brick_op}, //EVENT_STAGE_ACC {GD_OP_STATE_STAGE_OP_SENT, glusterd_op_ac_none}, //EVENT_COMMIT_ACC {GD_OP_STATE_STAGE_OP_FAILED, glusterd_op_ac_stage_op_failed}, //EVENT_RCVD_RJT @@ -3329,14 +3317,14 @@ glusterd_op_clear_op (glusterd_op_t op) } int32_t -glusterd_op_init_ctx () +glusterd_op_init_ctx (glusterd_op_t op) { int ret = 0; dict_t *dict = NULL; - glusterd_op_t op = GD_OP_NONE; - op = glusterd_op_get_op (); - if (_gf_false == glusterd_need_brick_op ()) { + GF_ASSERT (GD_OP_NONE < op && op < GD_OP_MAX); + + if (_gf_false == glusterd_need_brick_op (op)) { gf_log ("", GF_LOG_DEBUG, "Received op: %d, returning", op); goto out; } diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.h b/xlators/mgmt/glusterd/src/glusterd-op-sm.h index c5ed99fb..0a75d4c8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.h +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.h @@ -248,7 +248,7 @@ glusterd_handle_brick_rsp (glusterd_brickinfo_t *brickinfo, char **op_errstr); void glusterd_op_brick_disconnect (void *data); int32_t -glusterd_op_init_ctx (); +glusterd_op_init_ctx (glusterd_op_t op); int32_t glusterd_op_fini_ctx (); int32_t diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c index aa493bd7..3c7b6285 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c @@ -318,9 +318,10 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, else rsp.op_errstr = ""; ctx = op_ctx; - dict_allocate_and_serialize (ctx, - &rsp.stats_info.stats_info_val, - (size_t*)&rsp.stats_info.stats_info_len); + if (ctx) + dict_allocate_and_serialize (ctx, + &rsp.stats_info.stats_info_val, + (size_t*)&rsp.stats_info.stats_info_len); free_ptr = rsp.stats_info.stats_info_val; cli_rsp = &rsp; xdrproc = (xdrproc_t) xdr_gf1_cli_stats_volume_rsp; -- cgit