summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/basic/afr/quorum.t80
-rwxr-xr-xtests/bugs/glusterd/859927/repl.t15
-rwxr-xr-xtests/bugs/replicate/bug-802417.t1
-rw-r--r--xlators/cluster/afr/src/afr.c24
4 files changed, 97 insertions, 23 deletions
diff --git a/tests/basic/afr/quorum.t b/tests/basic/afr/quorum.t
new file mode 100644
index 00000000000..dbf8895e7ed
--- /dev/null
+++ b/tests/basic/afr/quorum.t
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+cleanup;
+
+TEST glusterd;
+TEST pidof glusterd
+
+function test_write {
+ dd of=$M0/a if=/dev/urandom bs=1k count=1 2>&1 > /dev/null
+}
+
+#Tests for quorum-type option for replica 2
+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};
+TEST $CLI volume start $V0
+TEST $GFS -s $H0 --volfile-id=$V0 $M0;
+
+touch $M0/a
+
+TEST ! $CLI volume set $V0 cluster.quorum-type ""
+TEST $CLI volume set $V0 cluster.quorum-type fixed
+EXPECT fixed volume_option $V0 cluster.quorum-type
+TEST $CLI volume set $V0 cluster.quorum-count 2
+TEST test_write
+TEST kill_brick $V0 $H0 $B0/${V0}1
+TEST ! test_write
+
+TEST $CLI volume set $V0 cluster.quorum-type auto
+EXPECT auto volume_option $V0 cluster.quorum-type
+TEST $CLI volume start $V0 force
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
+TEST test_write
+TEST kill_brick $V0 $H0 $B0/${V0}1
+TEST ! test_write
+
+TEST $CLI volume set $V0 cluster.quorum-type none
+EXPECT none volume_option $V0 cluster.quorum-type
+TEST test_write
+#Default is 'none' for even number of bricks in replication
+TEST $CLI volume reset $V0 cluster.quorum-type
+TEST test_write
+
+cleanup;
+TEST glusterd;
+TEST pidof glusterd
+
+#Tests for quorum-type option for replica 3
+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3};
+TEST $CLI volume start $V0
+TEST $GFS -s $H0 --volfile-id=$V0 $M0;
+
+touch $M0/a
+
+TEST $CLI volume set $V0 cluster.quorum-type fixed
+EXPECT fixed volume_option $V0 cluster.quorum-type
+TEST $CLI volume set $V0 cluster.quorum-count 3
+TEST test_write
+TEST kill_brick $V0 $H0 $B0/${V0}1
+TEST ! test_write
+
+TEST $CLI volume set $V0 cluster.quorum-type auto
+EXPECT auto volume_option $V0 cluster.quorum-type
+TEST test_write
+TEST kill_brick $V0 $H0 $B0/${V0}3
+TEST ! test_write
+
+TEST $CLI volume set $V0 cluster.quorum-type none
+EXPECT none volume_option $V0 cluster.quorum-type
+TEST test_write
+#Default is 'auto' for odd number of bricks in replication
+TEST $CLI volume reset $V0 cluster.quorum-type
+EXPECT "^$" volume_option $V0 cluster.quorum-type
+TEST ! test_write
+TEST $CLI volume start $V0 force
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2
+TEST kill_brick $V0 $H0 $B0/${V0}3
+TEST test_write
+cleanup;
diff --git a/tests/bugs/glusterd/859927/repl.t b/tests/bugs/glusterd/859927/repl.t
index db96d70bfa6..a500961165c 100755
--- a/tests/bugs/glusterd/859927/repl.t
+++ b/tests/bugs/glusterd/859927/repl.t
@@ -51,19 +51,4 @@ TEST cmp $B0/${V0}1/a $B0/${V0}2/a
TEST ! $CLI volume set $V0 cluster.data-self-heal-algorithm ""
-#Tests for quorum-type option
-TEST ! $CLI volume set $V0 cluster.quorum-type ""
-TEST $CLI volume set $V0 cluster.quorum-type fixed
-EXPECT fixed volume_option $V0 cluster.quorum-type
-TEST $CLI volume set $V0 cluster.quorum-count 2
-kill_brick $V0 $H0 $B0/${V0}1
-TEST ! test_write
-TEST $CLI volume set $V0 cluster.quorum-type auto
-EXPECT auto volume_option $V0 cluster.quorum-type
-TEST ! test_write
-TEST $CLI volume set $V0 cluster.quorum-type none
-EXPECT none volume_option $V0 cluster.quorum-type
-TEST test_write
-TEST $CLI volume reset $V0 cluster.quorum-type
-TEST test_write
cleanup;
diff --git a/tests/bugs/replicate/bug-802417.t b/tests/bugs/replicate/bug-802417.t
index ad411005ced..df989b1470b 100755
--- a/tests/bugs/replicate/bug-802417.t
+++ b/tests/bugs/replicate/bug-802417.t
@@ -38,6 +38,7 @@ TEST $CLI volume set $V0 cluster.background-self-heal-count 0
TEST $CLI volume start $V0;
EXPECT 'Started' volinfo_field $V0 'Status';
+TEST $CLI volume set $V0 cluster.quorum-type none
## Mount native
TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index 8e0c2ebef23..bf7ba3fb0ac 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -81,18 +81,26 @@ xlator_subvolume_index (xlator_t *this, xlator_t *subvol)
return index;
}
-void
-fix_quorum_options (xlator_t *this, afr_private_t *priv, char *qtype)
+static void
+fix_quorum_options (xlator_t *this, afr_private_t *priv, char *qtype,
+ dict_t *options)
{
- if (priv->quorum_count && strcmp(qtype,"fixed")) {
+ if (dict_get (options, "quorum-type") == NULL) {
+ /* If user doesn't configure anything enable auto-quorum if the
+ * replica has odd number of subvolumes */
+ if (priv->child_count % 2)
+ qtype = "auto";
+ }
+
+ if (priv->quorum_count && strcmp (qtype, "fixed")) {
gf_msg (this->name,GF_LOG_WARNING, 0, AFR_MSG_QUORUM_OVERRIDE,
"quorum-type %s overriding quorum-count %u",
qtype, priv->quorum_count);
}
- if (!strcmp(qtype,"none")) {
+
+ if (!strcmp (qtype, "none")) {
priv->quorum_count = 0;
- }
- else if (!strcmp(qtype,"auto")) {
+ } else if (!strcmp (qtype, "auto")) {
priv->quorum_count = AFR_QUORUM_AUTO;
}
}
@@ -179,7 +187,7 @@ reconfigure (xlator_t *this, dict_t *options)
GF_OPTION_RECONF ("quorum-type", qtype, options, str, out);
GF_OPTION_RECONF ("quorum-count", priv->quorum_count, options,
uint32, out);
- fix_quorum_options(this,priv,qtype);
+ fix_quorum_options (this, priv, qtype, options);
if (priv->quorum_count && !afr_has_quorum (priv->child_up, this))
gf_msg (this->name, GF_LOG_WARNING, 0, AFR_MSG_QUORUM_FAIL,
"Client-quorum is not met");
@@ -340,7 +348,7 @@ init (xlator_t *this)
GF_OPTION_INIT ("quorum-count", priv->quorum_count, uint32, out);
GF_OPTION_INIT (AFR_SH_READDIR_SIZE_KEY, priv->sh_readdir_size, size_uint64,
out);
- fix_quorum_options(this,priv,qtype);
+ fix_quorum_options (this, priv, qtype, this->options);
GF_OPTION_INIT ("post-op-delay-secs", priv->post_op_delay_secs, uint32, out);
GF_OPTION_INIT ("ensure-durability", priv->ensure_durability, bool,