diff options
| -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);  | 
