diff options
author | Joseph Fernandes <josferna@redhat.com> | 2014-04-21 20:28:22 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-04-30 23:27:23 -0700 |
commit | f63fbca7540a4c9ce090e1ed5941ed8777ff6316 (patch) | |
tree | f342c9aa37cbbc45ebfa66f77daff25696eac569 | |
parent | 57fddef768d0e0feee07e5d745dcb4656fe5cb84 (diff) |
[glusterd/snapshot] snapshot create force option
Implement force option in snapshot create i.e
1) Creation of snapshot fails if the original volume
bricks are down
2) With a force option creation of snapshot will continue
even if the original volume bricks are down.
This was the fix for bugs 1089527 and 1083502
Change-Id: I8de0242adf8ee0af00db9fa8701d86fabc12e7fc
BUG: 1090042
Signed-off-by: Joseph Fernandes <josferna@redhat.com>
Reviewed-on: http://review.gluster.org/7520
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rw-r--r-- | cli/src/cli-cmd-parser.c | 29 | ||||
-rwxr-xr-x | tests/bugs/bug-1090042.t | 30 | ||||
-rwxr-xr-x | tests/snapshot.rc | 11 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 34 |
4 files changed, 86 insertions, 18 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 5fdb9d08a74..de0654a744b 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2986,12 +2986,13 @@ out: */ int cli_snap_create_parse (dict_t *dict, const char **words, int wordcount) { - uint64_t i = 0; + uint64_t i = 0; int ret = -1; - uint64_t volcount = 0; - char key[PATH_MAX] = ""; + uint64_t volcount = 0; + char key[PATH_MAX] = ""; char *snapname = NULL; - unsigned int cmdi = 2; + unsigned int cmdi = 2; + int flags = 0; /* cmdi is command index, here cmdi is "2" (gluster snapshot create)*/ GF_ASSERT (words); @@ -3107,18 +3108,15 @@ cli_snap_create_parse (dict_t *dict, const char **words, int wordcount) { */ } - if ((strcmp (words[i], "force") != 0)) { + if (strcmp (words[i], "force") == 0) { + flags = GF_CLI_FLAG_OP_FORCE; + + } else { ret = -1; cli_err ("Invalid Syntax."); gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); goto out; } - ret = dict_set_int8 (dict, "snap-force", 1); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "snap force option"); - goto out; - } /* Check if the command has anything after "force" keyword */ if (++i < wordcount) { @@ -3130,6 +3128,15 @@ cli_snap_create_parse (dict_t *dict, const char **words, int wordcount) { ret = 0; out: + if(ret == 0) { + /*Adding force flag in either of the case i.e force set + * or unset*/ + ret = dict_set_int32 (dict, "flags", flags); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, "Could not save " + "snap force option"); + } + } return ret; } diff --git a/tests/bugs/bug-1090042.t b/tests/bugs/bug-1090042.t new file mode 100755 index 00000000000..364d8b2d66b --- /dev/null +++ b/tests/bugs/bug-1090042.t @@ -0,0 +1,30 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../snapshot.rc + +cleanup; + +TEST init_n_bricks 3; +TEST setup_lvm 3; +TEST glusterd; + +TEST $CLI volume create $V0 replica 3 $H0:$L1 $H0:$L2 $H0:$L3; +TEST $CLI volume start $V0; + +TEST kill_brick $V0 $H0 $L1; + +#Normal snap create should fail +TEST ! $CLI snapshot create ${V0}_snap1 $V0; +TEST ! snapshot_exists 0 ${V0}_snap1; + +#Force snap create should succeed +TEST $CLI snapshot create ${V0}_snap1 $V0 force; +TEST snapshot_exists 0 ${V0}_snap1; + +#Delete the created snap +TEST $CLI snapshot delete ${V0}_snap1; +TEST ! snapshot_exists 0 ${V0}_snap1; + +cleanup; diff --git a/tests/snapshot.rc b/tests/snapshot.rc index 87ea0df9190..37c250344f1 100755 --- a/tests/snapshot.rc +++ b/tests/snapshot.rc @@ -5,6 +5,17 @@ LVM_PREFIX="patchy_snap" LVM_COUNT=0 VHD_SIZE="1G" +#This function will init B# bricks +#This is used when launch_cluster is +#not called to init B#. Call it before +#setup_lvm +function init_n_bricks() { + local count=$1 + for i in `seq 1 $count`; do + eval "B$i=/d/backends/$i" + done +} + function init_lvm() { if [ "$1" == "" ]; then echo "Error: Invalid argument supplied" diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 374397e7c4c..c88444098c7 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -918,6 +918,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, gf_loglevel_t loglevel = GF_LOG_ERROR; glusterd_conf_t *conf = NULL; int64_t effective_max_limit = 0; + int flags = 0; this = THIS; GF_ASSERT (op_errstr); @@ -943,6 +944,12 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, goto out; } + ret = dict_get_int32 (dict, "flags", &flags); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Unable to get flags"); + goto out; + } + if (glusterd_find_snap_by_name (snapname)) { ret = -1; snprintf (err_str, sizeof (err_str), "Snap %s already exists", @@ -1026,13 +1033,26 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, } if (!glusterd_is_brick_started (brickinfo)) { - gf_log (this->name, GF_LOG_WARNING, - "brick %s:%s is not started", - brickinfo->hostname, - brickinfo->path); - brick_order++; - brick_count++; - continue; + if(flags & GF_CLI_FLAG_OP_FORCE) { + gf_log (this->name, GF_LOG_WARNING, + "brick %s:%s is not started", + brickinfo->hostname, + brickinfo->path); + brick_order++; + brick_count++; + continue; + } + + snprintf (err_str, sizeof (err_str), + "brick %s:%s is not started. " + "Please start the stopped brick " + "and then issue snapshot create " + "command or use [force] option in " + "snapshot create to override this " + "behavior.", brickinfo->hostname, + brickinfo->path); + ret = -1; + goto out; } device = glusterd_get_brick_mount_details (brickinfo); |