Blob Blame History Raw
From 74a0dd4ffd4bae7e5b304edf2b1b3991b15df65b Mon Sep 17 00:00:00 2001
From: Jiffin Tony Thottan <jthottan@redhat.com>
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 <volname> ganesha.enable on

 None			   |	create export file
			   |    in node where cli executed,
			   |	thne export volume via dbus

2.) gluster v set <volname> 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 <jthottan@redhat.com>
>Reviewed-on: http://review.gluster.org/14908
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
>Reviewed-by: soumya k <skoduri@redhat.com>
>Smoke: Gluster Build System <jenkins@build.gluster.org>
>Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
>Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>

Change-Id: Ia8b0e89bc8fff24b0bc5d20a538a89212894a8e4
BUG: 1344675
Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/84780
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 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