From 3bfa0dde137f35d68e7f935ddd562136b4829e21 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Wed, 7 Aug 2013 17:09:17 +0530 Subject: glusterd/gverify.sh: Stops session being created with invalid slave details create force will fail with proper message, if the ip is not reachable, or is unable to fetch slave details. Change-Id: I44a3ba777b37702ffd0e48e9cb46c51e293327d4 BUG: 988314 Signed-off-by: Avra Sengupta Signed-off-by: Venky Shankar Reviewed-on: http://review.gluster.org/5516 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- .../S56glusterd-geo-rep-create-post.sh | 5 +- geo-replication/src/gverify.sh | 25 ++++--- xlators/mgmt/glusterd/src/glusterd-geo-rep.c | 76 +++++++++++++++++++--- 3 files changed, 87 insertions(+), 19 deletions(-) diff --git a/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh b/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh index 71e44b6ed..1369c22fc 100755 --- a/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh +++ b/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh @@ -22,6 +22,7 @@ if [ "$val" == "" ]; then exit; fi pub_file=`echo $val` +pub_file_tmp=`echo $val`_tmp key=`echo $key_val_pair3 | cut -d '=' -f 1` val=`echo $key_val_pair3 | cut -d '=' -f 2` @@ -34,8 +35,8 @@ fi slave_ip=`echo $val` if [ -f $pub_file ]; then - ssh $slave_ip "\rm -rf $pub_file" - scp $pub_file $slave_ip:$pub_file &> /dev/null + scp $pub_file $slave_ip:$pub_file_tmp + ssh $slave_ip "mv $pub_file_tmp $pub_file" ssh $slave_ip "gluster system:: copy file /geo-replication/common_secret.pem.pub > /dev/null" ssh $slave_ip "gluster system:: execute add_secret_pub > /dev/null" fi diff --git a/geo-replication/src/gverify.sh b/geo-replication/src/gverify.sh index f10e21ed6..49ed2e925 100755 --- a/geo-replication/src/gverify.sh +++ b/geo-replication/src/gverify.sh @@ -96,6 +96,15 @@ function slave_stats() function main() { + log_file=$4 + > $log_file + + ping -w 5 $2; + if [ $? -ne 0 ]; then + echo "$2 not reachable." > $log_file + exit 1; + fi; + ERRORS=0; master_data=$(master_stats $1); slave_data=$(slave_stats $2 $3); @@ -104,24 +113,22 @@ function main() master_version=$(echo $master_data | cut -f2 -d':'); slave_version=$(echo $slave_data | cut -f2 -d':'); slave_no_of_files=$(echo $slave_data | cut -f3 -d':'); - log_file=$4 - > $log_file + slave_vol_test=$5 if [[ "x$master_size" = "x" || "x$master_version" = "x" || "$master_size" -eq "0" ]]; then - echo "Unable to fetch master volume details." > $log_file; + echo "Unable to fetch master volume details. Please check the master cluster and master volume." > $log_file; exit 1; fi; if [[ "x$slave_size" = "x" || "x$slave_version" = "x" || "$slave_size" -eq "0" ]]; then - ping -w 5 $2; - if [ $? -ne 0 ]; then - echo "$2 not reachable." > $log_file - exit 1; - fi; - echo "Unable to fetch slave volume details." > $log_file; + echo "Unable to fetch slave volume details. Please check the slave cluster and slave volume." > $log_file; exit 1; fi; + if [ ! -z $slave_vol_test ]; then + exit $ERRORS; + fi + if [ ! $slave_size -ge $(($master_size - $BUFFER_SIZE )) ]; then echo "Total size of master is greater than available size of slave." >> $log_file; ERRORS=$(($ERRORS + 1)); diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index 7ccf641c8..46d4d28e6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -1608,7 +1608,7 @@ out: static int glusterd_verify_slave (char *volname, char *slave_ip, char *slave, - char **op_errstr) + char **op_errstr, int slave_vol_test) { int32_t ret = -1; runner_t runner = {0,}; @@ -1636,6 +1636,8 @@ glusterd_verify_slave (char *volname, char *slave_ip, char *slave, runner_argprintf (&runner, "%s", slave_ip); runner_argprintf (&runner, "%s", slave); runner_argprintf (&runner, "%s", log_file_path); + if (slave_vol_test) + runner_add_args (&runner, "slave_vol_test", NULL); runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); synclock_unlock (&priv->big_lock); ret = runner_run (&runner); @@ -1660,6 +1662,52 @@ out: return ret; } +int +glusterd_validate_slave_ip_vol (dict_t *dict, char *volname, + char *host_uuid, char **op_errstr) +{ + int ret = -1; + char uuid_str [64] = ""; + char *slave = NULL; + char *slave_ip = NULL; + char *slave_vol = NULL; + + uuid_utoa_r (MY_UUID, uuid_str); + if (strcmp (uuid_str, host_uuid)) { + ret = 0; + goto out; + } + + ret = dict_get_str (dict, "slave", &slave); + if (ret || !slave) { + gf_log ("", GF_LOG_ERROR, "Unable to fetch slave from dict"); + ret = -1; + goto out; + } + + ret = glusterd_get_slave_info (slave, &slave_ip, &slave_vol); + if (ret) { + gf_log ("", GF_LOG_ERROR, + "Unable to fetch slave details."); + ret = -1; + goto out; + } + + /* Checking if slave ip is pingable and slave volume is + * valid. Fail even with failure in case of force */ + ret = glusterd_verify_slave (volname, slave_ip, slave_vol, + op_errstr, 1); + if (ret) { + gf_log ("", GF_LOG_ERROR, "%s", *op_errstr); + ret = -1; + goto out; + } + +out: + gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); + return ret; +} + int glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) { @@ -1748,8 +1796,10 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) volinfo->volname, slave); } + /* Checking if slave vol is empty, and if it has enough memory + * available, and bypass in case of force */ ret = glusterd_verify_slave (volname, slave_ip, slave_vol, - op_errstr); + op_errstr, 0); if ((ret) && !is_force) { gf_log ("", GF_LOG_ERROR, "%s is not a valid slave volume. Error: %s", @@ -1798,6 +1848,13 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) ret = glusterd_get_statefile_name (volinfo, slave, conf_path, &statefile); if (ret) { + ret = glusterd_validate_slave_ip_vol (dict, volname, + host_uuid, op_errstr); + if (ret) { + gf_log ("", GF_LOG_ERROR, "Slave validation failed."); + goto out; + } + if (!strstr(slave, "::")) snprintf (errmsg, sizeof (errmsg), "%s is not a valid slave url.", slave); @@ -1805,6 +1862,7 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) snprintf (errmsg, sizeof (errmsg), "Please check gsync " "config file. Unable to get statefile's name"); gf_log ("", GF_LOG_ERROR, "%s", errmsg); + ret = -1; goto out; } @@ -1889,7 +1947,7 @@ glusterd_op_stage_gsync_set (dict_t *dict, char **op_errstr) } ret = glusterd_op_gsync_args_get (dict, op_errstr, - &volname, &slave, NULL); + &volname, &slave, &host_uuid); if (ret) goto out; @@ -1916,6 +1974,13 @@ glusterd_op_stage_gsync_set (dict_t *dict, char **op_errstr) ret = glusterd_get_statefile_name (volinfo, slave, conf_path, &statefile); if (ret) { + ret = glusterd_validate_slave_ip_vol (dict, volname, + host_uuid, op_errstr); + if (ret) { + gf_log ("", GF_LOG_ERROR, "Slave validation failed."); + goto out; + } + if (!strstr(slave, "::")) snprintf (errmsg, sizeof (errmsg), "%s is not a valid slave url.", slave); @@ -1958,11 +2023,6 @@ glusterd_op_stage_gsync_set (dict_t *dict, char **op_errstr) /* Check if all peers that are a part of the volume are up or not */ if ((type == GF_GSYNC_OPTION_TYPE_DELETE) || ((type == GF_GSYNC_OPTION_TYPE_STOP) && !is_force)) { - ret = dict_get_str (dict, "host-uuid", &host_uuid); - if (ret < 0) - goto out; - - uuid_utoa_r (MY_UUID, uuid_str); if (!strcmp (uuid_str, host_uuid)) { ret = glusterd_are_vol_all_peers_up (volinfo, &conf->peers, -- cgit