From 74a0dd4ffd4bae7e5b304edf2b1b3991b15df65b Mon Sep 17 00:00:00 2001 From: Jiffin Tony Thottan Date: Wed, 13 Jul 2016 11:38:10 +0530 Subject: [PATCH 61/86] glusterd/ganesha : create export configuration file in shared storage This is the second patch which moves export related configuration for a volume into shared storage. The main change includes in scripts create-export-ganesha.sh, dbus-send.sh and the handling of volume set command "ganesha.enable". The manipulation of EXPORT_ID move from dbus-send.sh to create-export-ganesha.sh. In volume set handling following has performed stage | commit ---------------------------------------------------------- 1.) gluster v set ganesha.enable on None | create export file | in node where cli executed, | thne export volume via dbus 2.) gluster v set ganesha.enable off unexport volume via dbus | remove export file from the | shared storage ----------------------------------------------------------- More details can be found at http://review.gluster.org/#/c/15105/ Upstream reference : >Change-Id: Ia8b0e89bc8fff24b0bc5d20a538a89212894a8e4 >BUG: 1355956 >Signed-off-by: Jiffin Tony Thottan >Reviewed-on: http://review.gluster.org/14908 >NetBSD-regression: NetBSD Build System >CentOS-regression: Gluster Build System >Reviewed-by: soumya k >Smoke: Gluster Build System >Reviewed-by: Kaleb KEITHLEY >Signed-off-by: Jiffin Tony Thottan Change-Id: Ia8b0e89bc8fff24b0bc5d20a538a89212894a8e4 BUG: 1344675 Signed-off-by: Jiffin Tony Thottan Reviewed-on: https://code.engineering.redhat.com/gerrit/84780 Reviewed-by: Atin Mukherjee --- extras/ganesha/scripts/create-export-ganesha.sh | 54 ++++++++++----------- extras/ganesha/scripts/dbus-send.sh | 59 +--------------------- xlators/mgmt/glusterd/src/glusterd-ganesha.c | 55 ++++++++++++++------- xlators/mgmt/glusterd/src/glusterd-op-sm.c | 6 ++ xlators/mgmt/glusterd/src/glusterd.h | 1 + 5 files changed, 72 insertions(+), 103 deletions(-) diff --git a/extras/ganesha/scripts/create-export-ganesha.sh b/extras/ganesha/scripts/create-export-ganesha.sh index a1a35db..1ffba42 100755 --- a/extras/ganesha/scripts/create-export-ganesha.sh +++ b/extras/ganesha/scripts/create-export-ganesha.sh @@ -21,14 +21,17 @@ if [ -f /etc/default/ganesha ] fi GANESHA_DIR=${1%/} -VOL=$2 -CONF= +OPTION=$2 +VOL=$3 +CONF=$GANESHA_DIR"/ganesha.conf" +declare -i EXPORT_ID function check_cmd_status() { if [ "$1" != "0" ] then rm -rf $GANESHA_DIR/exports/export.$VOL.conf + sed -i /$VOL.conf/d $CONF exit 1 fi } @@ -40,28 +43,6 @@ if [ ! -d "$GANESHA_DIR/exports" ]; check_cmd_status `echo $?` fi -function find_rhel7_conf -{ - while [[ $# > 0 ]] - do - key="$1" - case $key in - -f) - CONFFILE="$2" - ;; - *) - ;; - esac - shift - done -} - -if [ -z $CONFFILE ]; then - find_rhel7_conf $OPTIONS - -fi -CONF=${CONFFILE:-/etc/ganesha/ganesha.conf} - function write_conf() { echo -e "# WARNING : Using Gluster CLI will overwrite manual @@ -85,9 +66,26 @@ echo ' Transports = "UDP","TCP";' echo ' SecType = "sys";' echo " }" } - -write_conf $@ > $GANESHA_DIR/exports/export.$VOL.conf -if ! (cat $CONF | grep $VOL.conf\"$ ) +if [ "$OPTION" = "on" ]; then -echo "%include \"$GANESHA_DIR/exports/export.$VOL.conf\"" >> $CONF + if ! (cat $CONF | grep $VOL.conf\"$ ) + then + write_conf $@ > $GANESHA_DIR/exports/export.$VOL.conf + echo "%include \"$GANESHA_DIR/exports/export.$VOL.conf\"" >> $CONF + count=`ls -l $GANESHA_DIR/exports/*.conf | wc -l` + if [ "$count" = "1" ] ; then + EXPORT_ID=2 + else + EXPORT_ID=`cat $GANESHA_DIR/.export_added` + check_cmd_status `echo $?` + EXPORT_ID=EXPORT_ID+1 + sed -i s/Export_Id.*/"Export_Id= $EXPORT_ID ;"/ \ + $GANESHA_DIR/exports/export.$VOL.conf + check_cmd_status `echo $?` + fi + echo $EXPORT_ID > $GANESHA_DIR/.export_added + fi +else + rm -rf $GANESHA_DIR/exports/export.$VOL.conf + sed -i /$VOL.conf/d $CONF fi diff --git a/extras/ganesha/scripts/dbus-send.sh b/extras/ganesha/scripts/dbus-send.sh index 14af095..c071d03 100755 --- a/extras/ganesha/scripts/dbus-send.sh +++ b/extras/ganesha/scripts/dbus-send.sh @@ -15,71 +15,22 @@ if [ -f /etc/default/ganesha ] . /etc/default/ganesha fi -declare -i EXPORT_ID GANESHA_DIR=${1%/} OPTION=$2 VOL=$3 -CONF= - -function find_rhel7_conf -{ - while [[ $# > 0 ]] - do - key="$1" - case $key in - -f) - CONFFILE="$2" - break; - ;; - *) - ;; - esac - shift - done -} - -if [ -z $CONFFILE ] - then - find_rhel7_conf $OPTIONS - -fi - -CONF=${CONFFILE:-/etc/ganesha/ganesha.conf} +CONF=$GANESHA_DIR"/ganesha.conf" function check_cmd_status() { if [ "$1" != "0" ] - then - rm -rf $GANESHA_DIR/exports/export.$VOL.conf - sed -i /$VOL.conf/d $CONF - exit 1 + then + logger "dynamic export failed on node :${hostname -s}" fi } #This function keeps track of export IDs and increments it with every new entry function dynamic_export_add() { - count=`ls -l $GANESHA_DIR/exports/*.conf | wc -l` - if [ "$count" = "1" ] ; - then - EXPORT_ID=2 - else - #if [ -s /var/lib/ganesha/export_removed ]; - # then - # EXPORT_ID=`head -1 /var/lib/ganesha/export_removed` - # sed -i -e "1d" /var/lib/ganesha/export_removed - # else - - EXPORT_ID=`cat $GANESHA_DIR/.export_added` - check_cmd_status `echo $?` - EXPORT_ID=EXPORT_ID+1 - #fi - fi - echo $EXPORT_ID > $GANESHA_DIR/.export_added - check_cmd_status `echo $?` - sed -i s/Export_Id.*/"Export_Id= $EXPORT_ID ;"/ \ -$GANESHA_DIR/exports/export.$VOL.conf - check_cmd_status `echo $?` dbus-send --system \ --dest=org.ganesha.nfsd /org/ganesha/nfsd/ExportMgr \ org.ganesha.nfsd.exportmgr.AddExport string:$GANESHA_DIR/exports/export.$VOL.conf \ @@ -92,14 +43,10 @@ function dynamic_export_remove() { removed_id=`cat $GANESHA_DIR/exports/export.$VOL.conf |\ grep Export_Id | awk -F"[=,;]" '{print$2}'| tr -d '[[:space:]]'` - check_cmd_status `echo $?` dbus-send --print-reply --system \ --dest=org.ganesha.nfsd /org/ganesha/nfsd/ExportMgr \ org.ganesha.nfsd.exportmgr.RemoveExport uint16:$removed_id check_cmd_status `echo $?` - sed -i /$VOL.conf/d $CONF - rm -rf $GANESHA_DIR/exports/export.$VOL.conf - } if [ "$OPTION" = "on" ]; diff --git a/xlators/mgmt/glusterd/src/glusterd-ganesha.c b/xlators/mgmt/glusterd/src/glusterd-ganesha.c index 38fc1f6..670c21f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-ganesha.c +++ b/xlators/mgmt/glusterd/src/glusterd-ganesha.c @@ -180,17 +180,22 @@ glusterd_check_ganesha_export (glusterd_volinfo_t *volinfo) { return is_exported; } - +/* * + * The below function is called as part of commit phase for volume set option + * "ganesha.enable". If the value is "on", it creates export configuration file + * and then export the volume via dbus command. Incase of "off", the volume + * will be already unexported during stage phase, so it will remove the conf + * file from shared storage + */ int glusterd_check_ganesha_cmd (char *key, char *value, char **errstr, dict_t *dict) { int ret = 0; - xlator_t *this = NULL; + char *volname = NULL; - this = THIS; - GF_ASSERT (this); GF_ASSERT (key); GF_ASSERT (value); + GF_ASSERT (dict); if ((strcmp (key, "ganesha.enable") == 0)) { if ((strcmp (value, "on")) && (strcmp (value, "off"))) { @@ -199,15 +204,28 @@ glusterd_check_ganesha_cmd (char *key, char *value, char **errstr, dict_t *dict) ret = -1; goto out; } - ret = glusterd_handle_ganesha_op (dict, errstr, key, value); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, 0, - GD_MSG_NFS_GNS_OP_HANDLE_FAIL, - "Handling NFS-Ganesha" - " op failed."); - } + if (strcmp (value, "on") == 0) { + ret = glusterd_handle_ganesha_op (dict, errstr, key, + value); + + } else if (is_origin_glusterd (dict)) { + ret = dict_get_str (dict, "volname", &volname); + if (ret) { + gf_msg ("glusterd-ganesha", GF_LOG_ERROR, errno, + GD_MSG_DICT_GET_FAILED, + "Unable to get volume name"); + goto out; + } + ret = create_export_config (volname, "off", errstr); + } } out: + if (ret) { + gf_msg ("glusterd-ganesha", GF_LOG_ERROR, 0, + GD_MSG_NFS_GNS_OP_HANDLE_FAIL, + "Handling NFS-Ganesha" + " op failed."); + } return ret; } @@ -415,7 +433,7 @@ check_host_list (void) } int -create_export_config (char *volname, char **op_errstr) +create_export_config (char *volname, char *value, char **op_errstr) { runner_t runner = {0,}; int ret = -1; @@ -424,7 +442,7 @@ create_export_config (char *volname, char **op_errstr) runinit (&runner); runner_add_args (&runner, "sh", GANESHA_PREFIX"/create-export-ganesha.sh", - CONFDIR, volname, NULL); + CONFDIR, value, volname, NULL); ret = runner_run(&runner); if (ret) @@ -513,9 +531,12 @@ ganesha_manage_export (dict_t *dict, char *value, char **op_errstr) goto out; } - /* Create the export file only when ganesha.enable "on" is executed */ + /* * + * Create the export file from the node where ganesha.enable "on" + * is executed + * */ if (option) { - ret = create_export_config (volname, op_errstr); + ret = create_export_config (volname, "on", op_errstr); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_EXPORT_FILE_CREATE_FAIL, @@ -810,11 +831,7 @@ glusterd_handle_ganesha_op (dict_t *dict, char **op_errstr, { int32_t ret = -1; - char *volname = NULL; - xlator_t *this = NULL; gf_boolean_t option = _gf_false; - static int export_id = 1; - glusterd_volinfo_t *volinfo = NULL; GF_ASSERT (dict); GF_ASSERT (op_errstr); diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index a228ba6..75b809d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -1060,6 +1060,12 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr) if (ret) goto out; + if ((strcmp (key, "ganesha.enable") == 0) && + (strcmp (value, "off") == 0)) { + ret = ganesha_manage_export (dict, "off", op_errstr); + if (ret) + goto out; + } ret = glusterd_check_quota_cmd (key, value, errstr, sizeof (errstr)); if (ret) goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 84b38e5..d981fa5 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -1073,6 +1073,7 @@ int glusterd_check_ganesha_cmd (char *key, char *value, int glusterd_op_stage_set_ganesha (dict_t *dict, char **op_errstr); int glusterd_op_set_ganesha (dict_t *dict, char **errstr); int ganesha_manage_export (dict_t *dict, char *value, char **op_errstr); +int create_export_config (char *volname, char *value, char **op_errstr); gf_boolean_t glusterd_check_ganesha_export (glusterd_volinfo_t *volinfo); int stop_ganesha (char **op_errstr); int tear_down_cluster (gf_boolean_t run_teardown); -- 1.7.1