diff options
| author | Krishnan Parthasarathi <kp@gluster.com> | 2011-09-15 17:09:00 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-09-15 22:06:30 -0700 | 
| commit | 4ee093305a0237368118e425723792a028b02a94 (patch) | |
| tree | 6463dc776aa9d826b71e6308fa832874d7cd4859 | |
| parent | 77cce4c7df9a61b599a27522696720e747714ff2 (diff) | |
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 <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 6 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 38 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.h | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 7 | 
5 files changed, 25 insertions, 30 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index d7a5988f2..c7bb2030e 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -3330,6 +3330,12 @@ gf_cli3_1_profile_volume_cbk (struct rpc_req *req, struct iovec *iov,          ret = dict_get_int32 (dict, "count", &brick_count);          if (ret)                  goto out; + +        if (!brick_count) { +                cli_out ("All bricks of volume %s are down.", volname); +                goto out; +        } +          while (i <= brick_count) {                  snprintf (key, sizeof (key), "%d-cumulative", i);                  ret = dict_get_int32 (dict, key, &interval); diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 2f486dac6..df0aa202c 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 b9d4606c7..14c9566ac 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 c5ed99fb9..0a75d4c84 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 aa493bd76..3c7b62855 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;  | 
