diff options
5 files changed, 91 insertions, 22 deletions
diff --git a/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t b/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t new file mode 100755 index 00000000000..e5b53bd0d24 --- /dev/null +++ b/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t @@ -0,0 +1,55 @@ +#!/bin/bash + +## Test case for bitrot +## bitd daemon should not start on the node which dont have any brick + + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc + +cleanup; + + +## Start a 2 node virtual cluster +TEST launch_cluster 2; + +## Peer probe server 2 from server 1 cli +TEST $CLI_1 peer probe $H2; + +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count + +## Creating a volume which is having brick only on one node +TEST $CLI_1 volume create $V0 $H1:$B1/${V0}0 $H1:$B1/${V0}1 + +## Start the volume +TEST $CLI_1 volume start $V0 + +## Enable bitrot on volume +TEST $CLI_1 volume bitrot $V0 enable + +## Bitd daemon should be running on the node which is having brick. Here node1 +## only have brick so bitrot daemon count value should be 1. +bitrot_daemon=$(ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | wc -l) +TEST [ "$bitrot_daemon" -eq 1 ]; + +## Bitd daemon should not run on 2nd node and it should not create bitrot +## volfile on this node. Below test case it to check whether its creating bitrot +## volfile or not for 2nd node which dont have any brick. +## Get current working directory of 2nd node which dont have any brick and do +## stat on bitrot volfile. + +cur_wrk_dir2=$($CLI_2 system:: getwd) +TEST ! stat $cur_wrk_dir2/bitd/bitd-server.vol + + +## Bitd daemon should run on 1st node and it should create bitrot +## volfile on this node. Below test case it to check whether its creating bitrot +## volfile or not for 1st node which is having brick. +## Get current working directory of 1st node which have brick and do +## stat on bitrot volfile. + +cur_wrk_dir1=$($CLI_1 system:: getwd) +TEST stat $cur_wrk_dir1/bitd/bitd-server.vol + +cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c b/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c index d007f3a0a0d..14c60fd5fba 100644 --- a/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c @@ -70,26 +70,40 @@ out: int glusterd_bitdsvc_manager (glusterd_svc_t *svc, void *data, int flags) { - int ret = -EINVAL; + int ret = 0; + xlator_t *this = NULL; + glusterd_volinfo_t *volinfo = data; + glusterd_brickinfo_t *brickinfo = NULL; + + this = THIS; + GF_ASSERT (this); + GF_ASSERT (volinfo); if (glusterd_all_volumes_with_bitrot_stopped ()) { ret = svc->stop (svc, SIGTERM); } else { - ret = glusterd_bitdsvc_create_volfile (); - if (ret) - goto out; - - ret = svc->stop (svc, SIGKILL); - if (ret) - goto out; - - ret = svc->start (svc, flags); - if (ret) - goto out; - - ret = glusterd_conn_connect (&(svc->conn)); - if (ret) - goto out; + cds_list_for_each_entry (brickinfo, &volinfo->bricks, + brick_list) { + if (!glusterd_is_local_brick (this, volinfo, brickinfo)) + continue; + + ret = glusterd_bitdsvc_create_volfile (); + if (ret) + goto out; + + ret = svc->stop (svc, SIGKILL); + if (ret) + goto out; + + ret = svc->start (svc, flags); + if (ret) + goto out; + + ret = glusterd_conn_connect (&(svc->conn)); + if (ret) + goto out; + break; + } } out: diff --git a/xlators/mgmt/glusterd/src/glusterd-bitrot.c b/xlators/mgmt/glusterd/src/glusterd-bitrot.c index ffc43698f95..083a714f596 100644 --- a/xlators/mgmt/glusterd/src/glusterd-bitrot.c +++ b/xlators/mgmt/glusterd/src/glusterd-bitrot.c @@ -310,7 +310,7 @@ glusterd_all_volumes_with_bitrot_stopped () } static int -glusterd_manage_bitrot (int opcode) +glusterd_manage_bitrot (int opcode, glusterd_volinfo_t *volinfo) { int ret = -1; xlator_t *this = NULL; @@ -326,7 +326,7 @@ glusterd_manage_bitrot (int opcode) case GF_BITROT_OPTION_TYPE_ENABLE: case GF_BITROT_OPTION_TYPE_DISABLE: ret = priv->bitd_svc.manager (&(priv->bitd_svc), - NULL, PROC_START_NO_WAIT); + volinfo, PROC_START_NO_WAIT); if (ret) break; ret = priv->scrub_svc.manager (&(priv->scrub_svc), NULL, @@ -416,7 +416,7 @@ glusterd_op_bitrot (dict_t *dict, char **op_errstr, dict_t *rsp_dict) goto out; } - ret = glusterd_manage_bitrot (type); + ret = glusterd_manage_bitrot (type, volinfo); if (ret) goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-svc-helper.c index 8ee715f1a94..b4280dcb9ba 100644 --- a/xlators/mgmt/glusterd/src/glusterd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-svc-helper.c @@ -136,7 +136,7 @@ glusterd_svcs_manager (glusterd_volinfo_t *volinfo) if (ret) goto out; - ret = conf->bitd_svc.manager (&(conf->bitd_svc), NULL, + ret = conf->bitd_svc.manager (&(conf->bitd_svc), volinfo, PROC_START_NO_WAIT); if (ret == -EINVAL) ret = 0; diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 9ee97cf87b5..aa27ebb18d3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -4308,7 +4308,7 @@ glusterd_restart_bricks (glusterd_conf_t *conf) continue; if (start_svcs == _gf_false) { start_svcs = _gf_true; - glusterd_svcs_manager (NULL); + glusterd_svcs_manager (volinfo); } gf_log (this->name, GF_LOG_DEBUG, "starting the volume %s", volinfo->volname); @@ -4324,7 +4324,7 @@ glusterd_restart_bricks (glusterd_conf_t *conf) continue; if (start_svcs == _gf_false) { start_svcs = _gf_true; - glusterd_svcs_manager (NULL); + glusterd_svcs_manager (volinfo); } start_svcs = _gf_true; gf_log (this->name, GF_LOG_DEBUG, "starting the snap " |