diff options
author | Avra Sengupta <asengupt@redhat.com> | 2015-01-21 08:25:23 +0000 |
---|---|---|
committer | Kaushal M <kaushal@redhat.com> | 2015-01-28 23:19:06 -0800 |
commit | 4493bfd8421116b5f45638b2f839874921f73fb3 (patch) | |
tree | a010c27bb2c0f28686cbd08a41394a6500abf20e | |
parent | 32c3d4e7a611f64a1f4eebe5711bcb112b94151f (diff) |
glusterd/snapshot: Fail snap create even if one brick is down.
In a n-way replication, where n>=3 fail snapshot,
even if one brick is down.
Also check for glusterd quorum, irrespective of the force option
Modified testcase tests/bugs/snapshot/bug-1090042.t because
it tested the successful creation of snapshot with force
command.
Change-Id: I72666f8f1484bd1766b9d6799c20766e4547f6c5
BUG: 1184344
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/9470
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
-rwxr-xr-x | tests/bugs/snapshot/bug-1090042.t | 8 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c | 40 |
2 files changed, 22 insertions, 26 deletions
diff --git a/tests/bugs/snapshot/bug-1090042.t b/tests/bugs/snapshot/bug-1090042.t index b4df8e6cebe..9eb3a9aecc4 100755 --- a/tests/bugs/snapshot/bug-1090042.t +++ b/tests/bugs/snapshot/bug-1090042.t @@ -19,12 +19,8 @@ TEST kill_brick $V0 $H0 $L1; 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; +#With changes introduced in BZ #1184344 force snap create should fail too +TEST ! $CLI snapshot create ${V0}_snap1 $V0 force; TEST ! snapshot_exists 0 ${V0}_snap1; cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c index 703e5eac66f..d3ad906705c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c @@ -2404,9 +2404,14 @@ glusterd_volume_quorum_calculate (glusterd_volinfo_t *volinfo, dict_t *dict, goto out; } - if (!snap_force && down_count) { + /* In a n-way replication where n >= 3 we should not take a snapshot + * if even one brick is down, irrespective of the quorum being met. + * TODO: Remove this restriction once n-way replication is + * supported with snapshot. + */ + if (down_count) { snprintf (err_str, sizeof (err_str), "One or more bricks may " - "be down. Use the force option "); + "be down."); gf_log (this->name, GF_LOG_ERROR, "%s", err_str); *op_errstr = gf_strdup (err_str); goto out; @@ -2601,25 +2606,20 @@ glusterd_snap_quorum_check_for_create (dict_t *dict, gf_boolean_t snap_volume, ret = dict_get_int32 (dict, "flags", &force); if (!ret && (force & GF_CLI_FLAG_OP_FORCE)) snap_force = 1; - if (!snap_force) { - /* Do a quorum check of glusterds also. Because, - the missed snapshot information will be saved - by glusterd and if glusterds are not in - quorum, then better fail the snapshot - */ - if (!does_gd_meet_server_quorum (this, peers_list, _gf_true)) { - snprintf (err_str, sizeof (err_str), - "glusterds are not in quorum"); - gf_log (this->name, GF_LOG_WARNING, "%s", - err_str); - *op_errstr = gf_strdup (err_str); - ret = -1; - goto out; - } - gf_log (this->name, GF_LOG_DEBUG, "glusterds are in " - "quorum"); - } + /* Do a quorum check of glusterds also. Because, the missed snapshot + * information will be saved by glusterd and if glusterds are not in + * quorum, then better fail the snapshot + */ + if (!does_gd_meet_server_quorum (this, peers_list, _gf_true)) { + snprintf (err_str, sizeof (err_str), + "glusterds are not in quorum"); + gf_log (this->name, GF_LOG_WARNING, "%s", err_str); + *op_errstr = gf_strdup (err_str); + ret = -1; + goto out; + } else + gf_log (this->name, GF_LOG_DEBUG, "glusterds are in quorum"); ret = dict_get_int64 (dict, "volcount", &volcount); if (ret) { |