glusterd: Add a cmd for getting uuid of local node
Usage: gluster system:: uuid get This is needed since we generate uuid of a node in a lazy manner. ie, we generate a uuid for the node only on the first volume or peer operation, when the node needs an external identity. With this command, we can force[1] the uuid generation, without a volume or peer operation performed. [1]: Querying for uuid (or uuid get), forces uuid to come into existence. Change-Id: I62c8b6754117756aa4d773dd48af4ddeb1a1d878 BUG: 971661 Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com> Reviewed-on: http://review.gluster.org/5175 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Kaushal M <kaushal@redhat.com>
This commit is contained in:
parent
50ae4e3eee
commit
214dccb317
@ -278,6 +278,53 @@ cli_cmd_umount_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
cli_cmd_uuid_get_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
||||
const char **words, int wordcount)
|
||||
{
|
||||
int ret = -1;
|
||||
int sent = 0;
|
||||
int parse_error = 0;
|
||||
dict_t *dict = NULL;
|
||||
rpc_clnt_procedure_t *proc = NULL;
|
||||
call_frame_t *frame = NULL;
|
||||
cli_local_t *local = NULL;
|
||||
xlator_t *this = NULL;
|
||||
|
||||
this = THIS;
|
||||
if (wordcount != 3) {
|
||||
cli_usage_out (word->pattern);
|
||||
parse_error = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UUID_GET];
|
||||
frame = create_frame (this, this->ctx->pool);
|
||||
if (!frame)
|
||||
goto out;
|
||||
|
||||
dict = dict_new ();
|
||||
if (!dict)
|
||||
goto out;
|
||||
|
||||
CLI_LOCAL_INIT (local, words, frame, dict);
|
||||
if (proc->fn)
|
||||
ret = proc->fn (frame, this, dict);
|
||||
|
||||
out:
|
||||
if (ret) {
|
||||
cli_cmd_sent_status_get (&sent);
|
||||
if ((sent == 0) && (parse_error == 0))
|
||||
cli_out ("uuid get failed");
|
||||
}
|
||||
|
||||
if (dict)
|
||||
dict_unref (dict);
|
||||
|
||||
CLI_STACK_DESTROY (frame);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
cli_cmd_uuid_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
||||
const char **words, int wordcount)
|
||||
@ -364,6 +411,10 @@ struct cli_cmd cli_system_cmds[] = {
|
||||
cli_cmd_umount_cbk,
|
||||
"request an umount"},
|
||||
|
||||
{ "system:: uuid get",
|
||||
cli_cmd_uuid_get_cbk,
|
||||
"get uuid of glusterd"},
|
||||
|
||||
{ "system:: uuid reset",
|
||||
cli_cmd_uuid_reset_cbk,
|
||||
"reset the uuid of glusterd"},
|
||||
|
@ -992,6 +992,88 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
gf_cli3_1_uuid_get_cbk (struct rpc_req *req, struct iovec *iov,
|
||||
int count, void *myframe)
|
||||
{
|
||||
char *uuid_str = NULL;
|
||||
gf_cli_rsp rsp = {0,};
|
||||
int ret = -1;
|
||||
cli_local_t *local = NULL;
|
||||
call_frame_t *frame = NULL;
|
||||
dict_t *dict = NULL;
|
||||
|
||||
if (-1 == req->rpc_status)
|
||||
goto out;
|
||||
|
||||
frame = myframe;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
local = frame->local;
|
||||
frame->local = NULL;
|
||||
|
||||
gf_log ("cli", GF_LOG_INFO, "Received resp to uuid get");
|
||||
|
||||
dict = dict_new ();
|
||||
if (!dict) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len,
|
||||
&dict);
|
||||
if (ret) {
|
||||
gf_log ("cli", GF_LOG_ERROR, "Failed to unserialize "
|
||||
"response for uuid get");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = dict_get_str (dict, "uuid", &uuid_str);
|
||||
if (ret) {
|
||||
gf_log ("cli", GF_LOG_ERROR, "Failed to get uuid "
|
||||
"from dictionary");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (global_state->mode & GLUSTER_MODE_XML) {
|
||||
ret = cli_xml_output_dict ("uuidGenerate", dict, rsp.op_ret,
|
||||
rsp.op_errno, rsp.op_errstr);
|
||||
if (ret)
|
||||
gf_log ("cli", GF_LOG_ERROR,
|
||||
"Error outputting to xml");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (rsp.op_ret) {
|
||||
if (strcmp (rsp.op_errstr, "") == 0)
|
||||
cli_err ("Get uuid was unsuccessful");
|
||||
else
|
||||
cli_err ("%s", rsp.op_errstr);
|
||||
|
||||
} else {
|
||||
cli_out ("UUID: %s", uuid_str);
|
||||
|
||||
}
|
||||
ret = rsp.op_ret;
|
||||
|
||||
out:
|
||||
cli_cmd_broadcast_response (ret);
|
||||
cli_local_wipe (local);
|
||||
if (rsp.dict.dict_val)
|
||||
free (rsp.dict.dict_val);
|
||||
if (dict)
|
||||
dict_unref (dict);
|
||||
|
||||
gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
gf_cli3_1_uuid_reset_cbk (struct rpc_req *req, struct iovec *iov,
|
||||
int count, void *myframe)
|
||||
@ -2890,6 +2972,29 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int32_t
|
||||
gf_cli3_1_uuid_get (call_frame_t *frame, xlator_t *this,
|
||||
void *data)
|
||||
{
|
||||
gf_cli_req req = {{0,}};
|
||||
int ret = 0;
|
||||
dict_t *dict = NULL;
|
||||
|
||||
if (!frame || !this || !data) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dict = data;
|
||||
ret = cli_to_glusterd (&req, frame, gf_cli3_1_uuid_get_cbk,
|
||||
(xdrproc_t)xdr_gf_cli_req, dict,
|
||||
GLUSTER_CLI_UUID_GET, this, cli_rpc_prog,
|
||||
NULL);
|
||||
out:
|
||||
gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int32_t
|
||||
gf_cli3_1_uuid_reset (call_frame_t *frame, xlator_t *this,
|
||||
void *data)
|
||||
@ -6762,6 +6867,7 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {
|
||||
[GLUSTER_CLI_DEPROBE] = {"DEPROBE_QUERY", gf_cli_deprobe},
|
||||
[GLUSTER_CLI_LIST_FRIENDS] = {"LIST_FRIENDS", gf_cli_list_friends},
|
||||
[GLUSTER_CLI_UUID_RESET] = {"UUID_RESET", gf_cli3_1_uuid_reset},
|
||||
[GLUSTER_CLI_UUID_GET] = {"UUID_GET", gf_cli3_1_uuid_get},
|
||||
[GLUSTER_CLI_CREATE_VOLUME] = {"CREATE_VOLUME", gf_cli_create_volume},
|
||||
[GLUSTER_CLI_DELETE_VOLUME] = {"DELETE_VOLUME", gf_cli_delete_volume},
|
||||
[GLUSTER_CLI_START_VOLUME] = {"START_VOLUME", gf_cli_start_volume},
|
||||
|
@ -155,6 +155,7 @@ enum gluster_cli_procnum {
|
||||
GLUSTER_CLI_CLRLOCKS_VOLUME,
|
||||
GLUSTER_CLI_UUID_RESET,
|
||||
GLUSTER_CLI_BD_OP,
|
||||
GLUSTER_CLI_UUID_GET,
|
||||
GLUSTER_CLI_MAXVALUE,
|
||||
};
|
||||
|
||||
|
@ -1227,6 +1227,104 @@ glusterd_handle_cli_uuid_reset (rpcsvc_request_t *req)
|
||||
__glusterd_handle_cli_uuid_reset);
|
||||
}
|
||||
|
||||
int
|
||||
__glusterd_handle_cli_uuid_get (rpcsvc_request_t *req)
|
||||
{
|
||||
int ret = -1;
|
||||
dict_t *dict = NULL;
|
||||
dict_t *rsp_dict = NULL;
|
||||
xlator_t *this = NULL;
|
||||
glusterd_conf_t *priv = NULL;
|
||||
gf_cli_rsp rsp = {0,};
|
||||
gf_cli_req cli_req = {{0,}};
|
||||
char msg_str[2048] = {0,};
|
||||
char uuid_str[64] = {0,};
|
||||
|
||||
GF_ASSERT (req);
|
||||
|
||||
this = THIS;
|
||||
priv = this->private;
|
||||
GF_ASSERT (priv);
|
||||
|
||||
ret = xdr_to_generic (req->msg[0], &cli_req, (xdrproc_t)xdr_gf_cli_req);
|
||||
if (ret < 0) {
|
||||
req->rpc_err = GARBAGE_ARGS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
gf_log ("glusterd", GF_LOG_DEBUG, "Received uuid get req");
|
||||
|
||||
if (cli_req.dict.dict_len) {
|
||||
dict = dict_new ();
|
||||
if (!dict) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = dict_unserialize (cli_req.dict.dict_val,
|
||||
cli_req.dict.dict_len,
|
||||
&dict);
|
||||
if (ret < 0) {
|
||||
gf_log ("glusterd", GF_LOG_ERROR,
|
||||
"failed to "
|
||||
"unserialize req-buffer to dictionary");
|
||||
snprintf (msg_str, sizeof (msg_str), "Unable to decode "
|
||||
"the buffer");
|
||||
goto out;
|
||||
|
||||
} else {
|
||||
dict->extra_stdfree = cli_req.dict.dict_val;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
rsp_dict = dict_new ();
|
||||
if (!rsp_dict) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
uuid_utoa_r (MY_UUID, uuid_str);
|
||||
ret = dict_set_str (rsp_dict, "uuid", uuid_str);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_ERROR, "Failed to set uuid in "
|
||||
"dictionary.");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = dict_allocate_and_serialize (rsp_dict, &rsp.dict.dict_val,
|
||||
&rsp.dict.dict_len);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_ERROR, "Failed to serialize "
|
||||
"dictionary.");
|
||||
goto out;
|
||||
}
|
||||
ret = 0;
|
||||
out:
|
||||
if (ret) {
|
||||
rsp.op_ret = -1;
|
||||
if (msg_str[0] == '\0')
|
||||
snprintf (msg_str, sizeof (msg_str), "Operation "
|
||||
"failed");
|
||||
rsp.op_errstr = msg_str;
|
||||
|
||||
} else {
|
||||
rsp.op_errstr = "";
|
||||
|
||||
}
|
||||
|
||||
glusterd_to_cli (req, &rsp, NULL, 0, NULL,
|
||||
(xdrproc_t)xdr_gf_cli_rsp, dict);
|
||||
|
||||
return 0;
|
||||
}
|
||||
int
|
||||
glusterd_handle_cli_uuid_get (rpcsvc_request_t *req)
|
||||
{
|
||||
return glusterd_big_locked_handler (req,
|
||||
__glusterd_handle_cli_uuid_get);
|
||||
}
|
||||
|
||||
int
|
||||
__glusterd_handle_cli_list_volume (rpcsvc_request_t *req)
|
||||
{
|
||||
@ -3544,6 +3642,7 @@ rpcsvc_actor_t gd_svc_cli_actors[] = {
|
||||
[GLUSTER_CLI_DEPROBE] = { "FRIEND_REMOVE", GLUSTER_CLI_DEPROBE, glusterd_handle_cli_deprobe, NULL, 0},
|
||||
[GLUSTER_CLI_LIST_FRIENDS] = { "LIST_FRIENDS", GLUSTER_CLI_LIST_FRIENDS, glusterd_handle_cli_list_friends, NULL, 0},
|
||||
[GLUSTER_CLI_UUID_RESET] = { "UUID_RESET", GLUSTER_CLI_UUID_RESET, glusterd_handle_cli_uuid_reset, NULL, 0},
|
||||
[GLUSTER_CLI_UUID_GET] = { "UUID_GET", GLUSTER_CLI_UUID_GET, glusterd_handle_cli_uuid_get, NULL, 0},
|
||||
[GLUSTER_CLI_START_VOLUME] = { "START_VOLUME", GLUSTER_CLI_START_VOLUME, glusterd_handle_cli_start_volume, NULL, 0},
|
||||
[GLUSTER_CLI_STOP_VOLUME] = { "STOP_VOLUME", GLUSTER_CLI_STOP_VOLUME, glusterd_handle_cli_stop_volume, NULL, 0},
|
||||
[GLUSTER_CLI_DELETE_VOLUME] = { "DELETE_VOLUME", GLUSTER_CLI_DELETE_VOLUME, glusterd_handle_cli_delete_volume, NULL, 0},
|
||||
|
Loading…
x
Reference in New Issue
Block a user