diff options
-rw-r--r-- | tests/bugs/glusterd/bug-1352277-spawn-daemons-on-two-node-setup.t | 37 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.c | 22 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.h | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 11 |
4 files changed, 67 insertions, 6 deletions
diff --git a/tests/bugs/glusterd/bug-1352277-spawn-daemons-on-two-node-setup.t b/tests/bugs/glusterd/bug-1352277-spawn-daemons-on-two-node-setup.t new file mode 100644 index 00000000000..53d8d34160e --- /dev/null +++ b/tests/bugs/glusterd/bug-1352277-spawn-daemons-on-two-node-setup.t @@ -0,0 +1,37 @@ +#!/bin/bash + +# Test case for checking whether the brick process(es) come up on a two node +# cluster if one of them is already down and other is going through a restart + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc + +cleanup; + +TEST launch_cluster 2 + +TEST $CLI_1 peer probe $H2; +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count + +# Lets create the volume +TEST $CLI_1 volume create $V0 $H1:$B1/${V0}1 $H2:$B2/${V0}2 + +# Start the volume +TEST $CLI_1 volume start $V0 + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}2 + +# Bring down all the gluster processes +TEST killall_gluster + +#Bring back 1st glusterd and check whether the brick process comes back +TEST $glusterd_1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}1 + +#Enabling quorum should bring down the brick +TEST $CLI_1 volume set $V0 cluster.server-quorum-type server +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" brick_up_status_1 $V0 $H1 $B1/${V0}1 + +cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c index 4131296ef12..1a97111d0f5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c @@ -1034,3 +1034,25 @@ glusterd_peerinfo_find_by_generation (uint32_t generation) { generation); return found; } + +int +glusterd_get_peers_count () { + int count = 0; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + glusterd_peerinfo_t *peer = NULL; + + this = THIS; + GF_VALIDATE_OR_GOTO ("glusterd", this, out); + + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, conf, out); + + rcu_read_lock (); + cds_list_for_each_entry_rcu (peer, &conf->peers, uuid_list) + count++; + rcu_read_unlock (); + +out: + return count; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h index 9332cf2ea02..e74d1ed9536 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h @@ -87,4 +87,7 @@ gd_add_peer_detail_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *friends, int count); glusterd_peerinfo_t * glusterd_peerinfo_find_by_generation (uint32_t generation); + +int +glusterd_get_peers_count (); #endif /* _GLUSTERD_PEER_UTILS_H */ diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index d35ca8dda09..d5002dfe1f1 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -1743,13 +1743,12 @@ init (xlator_t *this) if (ret < 0) goto out; - /* If there are no 'friends', this would be the best time to - * spawn process/bricks that may need (re)starting since last - * time (this) glusterd was up.*/ - - if (cds_list_empty (&conf->peers)) { + /* If the peer count is less than 2 then this would be the best time to + * spawn process/bricks that may need (re)starting since last time + * (this) glusterd was up. */ + if (glusterd_get_peers_count () < 2) glusterd_launch_synctask (glusterd_spawn_daemons, NULL); - } + ret = glusterd_options_init (this); if (ret < 0) goto out; |