summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoseph Fernandes <josferna@redhat.com>2014-04-21 20:28:22 +0530
committerVijay Bellur <vbellur@redhat.com>2014-04-30 23:27:23 -0700
commitf63fbca7540a4c9ce090e1ed5941ed8777ff6316 (patch)
treef342c9aa37cbbc45ebfa66f77daff25696eac569
parent57fddef768d0e0feee07e5d745dcb4656fe5cb84 (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.c29
-rwxr-xr-xtests/bugs/bug-1090042.t30
-rwxr-xr-xtests/snapshot.rc11
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c34
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);