diff options
Diffstat (limited to 'cli/src/cli-rpc-ops.c')
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 223 | 
1 files changed, 215 insertions, 8 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 6259546b6e9..6b5277ced95 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -2961,6 +2961,149 @@ out:  }  int +gf_cli_reset_brick_cbk (struct rpc_req *req, struct iovec *iov, +                        int count, void *myframe) +{ +        gf_cli_rsp                       rsp              = {0,}; +        int                              ret              = -1; +        cli_local_t                     *local            = NULL; +        call_frame_t                    *frame            = NULL; +        char                            *src_brick        = NULL; +        char                            *dst_brick        = NULL; +        char                            *status_reply     = NULL; +        char                            *rb_operation_str = NULL; +        dict_t                          *rsp_dict         = NULL; +        char                             msg[1024]        = {0,}; +        char                            *task_id_str      = NULL; +        char                            *reset_op         = NULL; + +        GF_ASSERT (myframe); + +        if (-1 == req->rpc_status) { +                goto out; +        } + +        frame = myframe; + +        GF_ASSERT (frame->local); + +        local = frame->local; + +        ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); +        if (ret < 0) { +                gf_log (frame->this->name, GF_LOG_ERROR, +                        "Failed to decode xdr response"); +                goto out; +        } + +        ret = dict_get_str (local->dict, "operation", &reset_op); +        if (ret) { +                gf_log (frame->this->name, GF_LOG_ERROR, +                        "dict_get on operation failed"); +                goto out; +        } + +        if (rsp.dict.dict_len) { +                /* Unserialize the dictionary */ +                rsp_dict  = dict_new (); + +                ret = dict_unserialize (rsp.dict.dict_val, +                                rsp.dict.dict_len, +                                &rsp_dict); +                if (ret < 0) { +                        gf_log (frame->this->name, GF_LOG_ERROR, "failed to " +                                "unserialize rsp buffer to dictionary"); +                        goto out; +                } +        } + +        if (strcmp (reset_op, "GF_RESET_OP_START") && +            strcmp (reset_op, "GF_RESET_OP_COMMIT") && +            strcmp (reset_op, "GF_RESET_OP_COMMIT_FORCE")) { +                rb_operation_str = gf_strdup ("Unknown operation"); +                ret = -1; +                goto out; +        } + +        if (rsp.op_ret && (strcmp (rsp.op_errstr, ""))) { +                rb_operation_str = gf_strdup (rsp.op_errstr); +        } else { +                if (!strcmp (reset_op, "GF_RESET_OP_START")) { +                        if (rsp.op_ret) +                                rb_operation_str = gf_strdup ("reset-brick " +                                                              "start " +                                                              "operation " +                                                              "failed"); +                        else +                                rb_operation_str = gf_strdup ("reset-brick " +                                                              "start " +                                                              "operation " +                                                              "successful"); +                } else if (!strcmp (reset_op, "GF_RESET_OP_COMMIT")) { + +                        if (rsp.op_ret) +                                rb_operation_str = gf_strdup ("reset-brick " +                                                              "commit " +                                                              "operation " +                                                              "failed"); +                        else +                                rb_operation_str = gf_strdup ("reset-brick " +                                                              "commit " +                                                              "operation " +                                                              "successful"); +                } else if (!strcmp (reset_op, "GF_RESET_OP_COMMIT_FORCE")) { + +                        if (rsp.op_ret) +                                rb_operation_str = gf_strdup ("reset-brick " +                                                              "commit " +                                                              "force operation " +                                                              "failed"); +                        else +                                rb_operation_str = gf_strdup ("reset-brick " +                                                              "commit " +                                                              "force operation " +                                                              "successful"); +                } +        } + +        gf_log ("cli", GF_LOG_INFO, "Received resp to reset brick"); +        snprintf (msg, sizeof (msg), "%s", +                  rb_operation_str ? rb_operation_str : "Unknown operation"); + +        if (global_state->mode & GLUSTER_MODE_XML) { +                ret = cli_xml_output_vol_replace_brick (rsp_dict, +                                                        rsp.op_ret, +                                                        rsp.op_errno, msg); +                if (ret) +                        gf_log ("cli", GF_LOG_ERROR, +                                "Error outputting to xml"); +                goto out; +        } + +        if (rsp.op_ret) +                cli_err ("volume reset-brick: failed: %s", msg); +        else +                cli_out ("volume reset-brick: success: %s", msg); +        ret = rsp.op_ret; + +out: +        if (frame) +                frame->local = NULL; + +        if (local) +                cli_local_wipe (local); + +        if (rb_operation_str) +                GF_FREE (rb_operation_str); + +        cli_cmd_broadcast_response (ret); +        free (rsp.dict.dict_val); +        if (rsp_dict) +                dict_unref (rsp_dict); + +        return ret; +} +int  gf_cli_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,                               int count, void *myframe)  { @@ -2971,7 +3114,7 @@ gf_cli_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,          char                            *rb_operation_str = NULL;          dict_t                          *rsp_dict         = NULL;          char                             msg[1024]        = {0,}; -        char                            *replace_op       = 0; +        char                            *replace_op       = NULL;          GF_ASSERT (myframe); @@ -3013,7 +3156,7 @@ gf_cli_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,                  }          } -        if (!strcmp(replace_op, "GF_REPLACE_OP_COMMIT_FORCE")) { +        if (!strcmp (replace_op, "GF_REPLACE_OP_COMMIT_FORCE")) {                  if (rsp.op_ret || ret)                          rb_operation_str = gf_strdup ("replace-brick commit " @@ -3035,7 +3178,7 @@ gf_cli_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,                    rb_operation_str ? rb_operation_str : "Unknown operation");          if (global_state->mode & GLUSTER_MODE_XML) { -                ret = cli_xml_output_vol_replace_brick (replace_op, rsp_dict, +                ret = cli_xml_output_vol_replace_brick (rsp_dict,                                                          rsp.op_ret,                                                          rsp.op_errno, msg);                  if (ret) @@ -3054,10 +3197,8 @@ out:          if (frame)                  frame->local = NULL; -        if (local) { -                dict_unref (local->dict); +        if (local)                  cli_local_wipe (local); -        }          if (rb_operation_str)                  GF_FREE (rb_operation_str); @@ -4889,8 +5030,73 @@ out:  }  int32_t +gf_cli_reset_brick (call_frame_t *frame, xlator_t *this, void *data) +{ +        gf_cli_req                  req        =  { {0,} }; +        int                         ret        = 0; +        dict_t                     *dict       = NULL; +        char                       *dst_brick  = NULL; +        char                       *src_brick  = NULL; +        char                       *volname    = NULL; +        char                       *op         = NULL; + +        if (!frame || !this ||  !data) { +                ret = -1; +                goto out; +        } + +        dict = data; + +        ret = dict_get_str (dict, "operation", &op); +        if (ret) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "dict_get on operation failed"); +                goto out; +        } + +        ret = dict_get_str (dict, "volname", &volname); +        if (ret) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "dict_get on volname failed"); +                goto out; +        } + +        ret = dict_get_str (dict, "src-brick", &src_brick); +        if (ret) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "dict_get on src-brick failed"); +                goto out; +        } + +        if (!strcmp (op, "GF_RESET_OP_COMMIT") || +            !strcmp (op, "GF_RESET_OP_COMMIT_FORCE")) { +                ret = dict_get_str (dict, "dst-brick", &dst_brick); +                if (ret) { +                        gf_log (this->name, GF_LOG_DEBUG, +                                "dict_get on dst-brick failed"); +                        goto out; +                } +        } + +        gf_log (this->name, GF_LOG_DEBUG, +                "Received command reset-brick %s on %s.", op, src_brick); + +        ret = cli_to_glusterd (&req, frame, gf_cli_reset_brick_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_RESET_BRICK, this, cli_rpc_prog, +                               NULL); + +out: +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + +        GF_FREE (req.dict.dict_val); + +        return ret; +} + +int32_t  gf_cli_replace_brick (call_frame_t *frame, xlator_t *this, -                         void *data) +                      void *data)  {          gf_cli_req                  req        =  {{0,}};          int                         ret        = 0; @@ -11345,7 +11551,8 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_ATTACH_TIER]      = {"ATTACH_TIER", gf_cli_attach_tier},          [GLUSTER_CLI_DETACH_TIER]      = {"DETACH_TIER", gf_cli_detach_tier},          [GLUSTER_CLI_TIER]             = {"TIER", gf_cli_tier}, -        [GLUSTER_CLI_GET_STATE]        = {"GET_STATE", gf_cli_get_state} +        [GLUSTER_CLI_GET_STATE]        = {"GET_STATE", gf_cli_get_state}, +        [GLUSTER_CLI_RESET_BRICK]      = {"RESET_BRICK", gf_cli_reset_brick}  };  struct rpc_clnt_program cli_prog = {  | 
