From efd93f0b2b42f8a8b151bf694fdd340fbcb22ec0 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Sat, 31 Jan 2015 16:07:03 +0530 Subject: cluster/afr: Enable auto-quorum for replicate with odd number of bricks Change-Id: I908934f1f22cf7d2d0ceccc0dedf28a69861997f BUG: 1187885 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/9517 Tested-by: Gluster Build System Reviewed-by: Krutika Dhananjay Reviewed-by: Anuradha Talur Reviewed-by: Ravishankar N --- tests/basic/afr/quorum.t | 80 +++++++++++++++++++++++++++++++++++++++ tests/bugs/glusterd/859927/repl.t | 15 -------- tests/bugs/replicate/bug-802417.t | 1 + xlators/cluster/afr/src/afr.c | 24 ++++++++---- 4 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 tests/basic/afr/quorum.t 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, -- cgit