glusterd: volume-sync shouldn't validate volume-id

- volume sync would overwrite volume information on local node
  from the hostname supplied. This warning is provided to the user.

- Also fixed a double free in volume-sync handler.

Change-Id: Icc68d9d563fb50ca58d5880921f063692e1e6882
BUG: 865700
Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-on: http://review.gluster.org/4188
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
This commit is contained in:
Krishnan Parthasarathi 2012-10-30 10:23:20 +05:30 committed by Vijay Bellur
parent 8fd4aa7414
commit cee1b62d01
3 changed files with 22 additions and 35 deletions

View File

@ -125,6 +125,11 @@ cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word,
int parse_error = 0;
dict_t *dict = NULL;
cli_local_t *local = NULL;
gf_answer_t answer = GF_ANSWER_NO;
const char *question = "Sync volume may make data "
"inaccessible while the sync "
"is in progress. Do you want "
"to continue?";
if ((wordcount < 3) || (wordcount > 4)) {
cli_usage_out (word->pattern);
@ -159,6 +164,14 @@ cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word,
goto out;
}
if (!(state->mode & GLUSTER_MODE_SCRIPT)) {
answer = cli_cmd_get_confirmation (state, question);
if (GF_ANSWER_NO == answer) {
ret = 0;
goto out;
}
}
proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SYNC_VOLUME];
frame = create_frame (THIS, THIS->ctx->pool);

View File

@ -1137,7 +1137,6 @@ glusterd_handle_sync_volume (rpcsvc_request_t *req)
dict_t *dict = NULL;
gf_cli_rsp cli_rsp = {0.};
char msg[2048] = {0,};
glusterd_volinfo_t *volinfo = NULL;
char *volname = NULL;
gf1_cli_sync_volume flags = 0;
char *hostname = NULL;
@ -1194,30 +1193,6 @@ glusterd_handle_sync_volume (rpcsvc_request_t *req)
goto out;
}
if (!flags) {
ret = glusterd_volinfo_find (volname, &volinfo);
if (!ret) {
snprintf (msg, sizeof (msg), "please delete the "
"volume: %s before sync", volname);
ret = -1;
goto out;
}
ret = dict_set_dynmstr (dict, "volname", volname);
if (ret) {
gf_log ("", GF_LOG_ERROR, "volume name set failed");
snprintf (msg, sizeof (msg), "volume name set failed");
goto out;
}
} else {
if (glusterd_volume_count_get ()) {
snprintf (msg, sizeof (msg), "please delete all the "
"volumes before full sync");
ret = -1;
goto out;
}
}
ret = glusterd_op_begin (req, GD_OP_SYNC_VOLUME, dict);
out:

View File

@ -785,9 +785,6 @@ glusterd_op_stage_sync_volume (dict_t *dict, char **op_errstr)
if (ret)
goto out;
ret = glusterd_validate_volume_id (dict, volinfo);
if (ret)
goto out;
} else {
ret = 0;
}
@ -2240,6 +2237,7 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
{
int ret = -1;
void *ctx = NULL;
dict_t *dict = NULL;
dict_t *req_dict = NULL;
glusterd_op_t op = GD_OP_NONE;
char *volname = NULL;
@ -2271,10 +2269,10 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
}
#undef GD_SYNC_OPCODE_KEY
dict = ctx;
switch (op) {
case GD_OP_CREATE_VOLUME:
{
dict_t *dict = ctx;
++glusterfs_port;
ret = dict_set_int32 (dict, "port",
glusterfs_port);
@ -2286,7 +2284,6 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
case GD_OP_GSYNC_SET:
{
dict_t *dict = ctx;
ret = glusterd_op_gsync_args_get (dict,
&errstr,
&volname,
@ -2303,7 +2300,6 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
case GD_OP_SET_VOLUME:
{
dict_t *dict = ctx;
ret = dict_get_str (dict, "volname", &volname);
if (ret) {
gf_log (THIS->name, GF_LOG_CRITICAL,
@ -2323,9 +2319,14 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
}
break;
case GD_OP_SYNC_VOLUME:
{
dict_copy (dict, req_dict);
break;
}
case GD_OP_STATUS_VOLUME:
{
dict_t *dict = ctx;
ret = dict_get_uint32 (dict, "cmd",
&status_cmd);
if (ret) {
@ -2339,7 +2340,7 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
break;
}
}
/*fall-through*/
case GD_OP_DELETE_VOLUME:
case GD_OP_START_VOLUME:
case GD_OP_STOP_VOLUME:
@ -2348,7 +2349,6 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
case GD_OP_RESET_VOLUME:
case GD_OP_REMOVE_BRICK:
case GD_OP_LOG_ROTATE:
case GD_OP_SYNC_VOLUME:
case GD_OP_QUOTA:
case GD_OP_PROFILE_VOLUME:
case GD_OP_REBALANCE:
@ -2357,7 +2357,6 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
case GD_OP_CLEARLOCKS_VOLUME:
case GD_OP_DEFRAG_BRICK_VOLUME:
{
dict_t *dict = ctx;
ret = dict_get_str (dict, "volname", &volname);
if (ret) {
gf_log (THIS->name, GF_LOG_CRITICAL,