glusterd, cli: adds 'force' for 'peer detach'
Adds add a 'force' option to 'peer detach' to forcefully detach a peer from a cluster, even when the cluster contains volumes with bricks on the peer. Change-Id: I134df51c16a07345c8869b318141d427b572eba5 BUG: 3549 Reviewed-on: http://review.gluster.com/429 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Krishnan Parthasarathi <kp@gluster.com>
This commit is contained in:
parent
795c8996c1
commit
acea7409a3
@ -31,6 +31,7 @@
|
||||
#include "cli.h"
|
||||
#include "cli-cmd.h"
|
||||
#include "cli-mem-types.h"
|
||||
#include "cli1-xdr.h"
|
||||
#include "protocol-common.h"
|
||||
|
||||
extern struct rpc_clnt *global_rpc;
|
||||
@ -107,10 +108,11 @@ cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
||||
rpc_clnt_procedure_t *proc = NULL;
|
||||
call_frame_t *frame = NULL;
|
||||
dict_t *dict = NULL;
|
||||
int flags = 0;
|
||||
int sent = 0;
|
||||
int parse_error = 0;
|
||||
|
||||
if (!(wordcount == 3) ) {
|
||||
if ((wordcount < 3) || (wordcount > 4)) {
|
||||
cli_usage_out (word->pattern);
|
||||
parse_error = 1;
|
||||
goto out;
|
||||
@ -134,6 +136,20 @@ cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
||||
goto out;
|
||||
}
|
||||
*/
|
||||
if (wordcount == 4) {
|
||||
if (!strcmp("force", words[3]))
|
||||
flags |= GF_CLI_FLAG_OP_FORCE;
|
||||
else {
|
||||
ret = -1;
|
||||
cli_usage_out (word->pattern);
|
||||
parse_error = 1;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
ret = dict_set_int32 (dict, "flags", flags);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (proc->fn) {
|
||||
ret = proc->fn (frame, THIS, dict);
|
||||
}
|
||||
@ -188,7 +204,7 @@ struct cli_cmd cli_probe_cmds[] = {
|
||||
cli_cmd_peer_probe_cbk,
|
||||
"probe peer specified by <HOSTNAME>"},
|
||||
|
||||
{ "peer detach <HOSTNAME>",
|
||||
{ "peer detach <HOSTNAME> [force]",
|
||||
cli_cmd_peer_deprobe_cbk,
|
||||
"detach peer specified by <HOSTNAME>"},
|
||||
|
||||
|
@ -1718,6 +1718,7 @@ gf_cli3_1_deprobe (call_frame_t *frame, xlator_t *this,
|
||||
dict_t *dict = NULL;
|
||||
char *hostname = NULL;
|
||||
int port = 0;
|
||||
int flags = 0;
|
||||
|
||||
if (!frame || !this || !data) {
|
||||
ret = -1;
|
||||
@ -1733,9 +1734,13 @@ gf_cli3_1_deprobe (call_frame_t *frame, xlator_t *this,
|
||||
if (ret)
|
||||
port = CLI_GLUSTERD_PORT;
|
||||
|
||||
ret = dict_get_int32 (dict, "flags", &flags);
|
||||
if (ret)
|
||||
flags = 0;
|
||||
|
||||
req.hostname = hostname;
|
||||
req.port = port;
|
||||
|
||||
req.flags = flags;
|
||||
ret = cli_cmd_submit (&req, frame, cli_rpc_prog,
|
||||
GLUSTER_CLI_DEPROBE, NULL,
|
||||
this, gf_cli3_1_deprobe_cbk,
|
||||
|
@ -255,6 +255,8 @@ xdr_gf1_cli_deprobe_req (XDR *xdrs, gf1_cli_deprobe_req *objp)
|
||||
return FALSE;
|
||||
if (!xdr_int (xdrs, &objp->port))
|
||||
return FALSE;
|
||||
if (!xdr_int (xdrs, &objp->flags))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -176,6 +176,7 @@ typedef struct gf1_cli_probe_rsp gf1_cli_probe_rsp;
|
||||
struct gf1_cli_deprobe_req {
|
||||
char *hostname;
|
||||
int port;
|
||||
int flags;
|
||||
};
|
||||
typedef struct gf1_cli_deprobe_req gf1_cli_deprobe_req;
|
||||
|
||||
|
@ -117,6 +117,7 @@ enum gf1_cli_top_op {
|
||||
struct gf1_cli_deprobe_req {
|
||||
string hostname<>;
|
||||
int port;
|
||||
int flags;
|
||||
} ;
|
||||
|
||||
struct gf1_cli_deprobe_rsp {
|
||||
|
@ -693,7 +693,7 @@ int
|
||||
glusterd_handle_cli_deprobe (rpcsvc_request_t *req)
|
||||
{
|
||||
int32_t ret = -1;
|
||||
gf1_cli_probe_req cli_req = {0,};
|
||||
gf1_cli_deprobe_req cli_req = {0,};
|
||||
uuid_t uuid = {0};
|
||||
int op_errno = 0;
|
||||
xlator_t *this = NULL;
|
||||
@ -705,7 +705,8 @@ glusterd_handle_cli_deprobe (rpcsvc_request_t *req)
|
||||
GF_ASSERT (priv);
|
||||
GF_ASSERT (req);
|
||||
|
||||
if (!xdr_to_generic (req->msg[0], &cli_req, (xdrproc_t)xdr_gf1_cli_probe_req)) {
|
||||
if (!xdr_to_generic (req->msg[0], &cli_req,
|
||||
(xdrproc_t)xdr_gf1_cli_deprobe_req)) {
|
||||
//failed to decode msg;
|
||||
req->rpc_err = GARBAGE_ARGS;
|
||||
goto out;
|
||||
@ -725,7 +726,7 @@ glusterd_handle_cli_deprobe (rpcsvc_request_t *req)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!uuid_is_null (uuid)) {
|
||||
if (!uuid_is_null (uuid) && !(cli_req.flags & GF_CLI_FLAG_OP_FORCE)) {
|
||||
ret = glusterd_all_volume_cond_check (
|
||||
glusterd_friend_brick_belongs,
|
||||
-1, &uuid);
|
||||
|
Loading…
x
Reference in New Issue
Block a user