Blob Blame History Raw
From 79bef076f8210eab2b0ac8e70580b8906bf818b1 Mon Sep 17 00:00:00 2001
From: Jiffin Tony Thottan <jthottan@redhat.com>
Date: Tue, 12 Jul 2016 17:23:03 +0530
Subject: [PATCH 59/86] Revert "glusterd-ganesha : copy ganesha export configuration files during reboot"

This reverts commit f71e2fa49af185779b9f43e146effd122d4e9da0.

Reason:
As part of sync up node reboot this patch copies ganesha export conf file
from a source node. This change is no more require if the export files are
available in shared storage.

Upstream reference :
>Change-Id: Id9c1ae78377bbd7d5d80aa1c14f534e30feaae97
>BUG: 1355956
>Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
>Reviewed-on: http://review.gluster.org/14907
>Reviewed-by: soumya k <skoduri@redhat.com>
>Smoke: Gluster Build System <jenkins@build.gluster.org>
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
>Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
>Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>

Change-Id: Id9c1ae78377bbd7d5d80aa1c14f534e30feaae97
BUG: 1348949
Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/84778
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 extras/ganesha/scripts/Makefile.am              |    4 +-
 extras/ganesha/scripts/copy-export-ganesha.sh   |   97 -----------
 xlators/mgmt/glusterd/src/glusterd-ganesha.c    |  194 ++++++++---------------
 xlators/mgmt/glusterd/src/glusterd-op-sm.c      |    2 +-
 xlators/mgmt/glusterd/src/glusterd-utils.c      |   32 ----
 xlators/mgmt/glusterd/src/glusterd-volume-ops.c |    2 +-
 xlators/mgmt/glusterd/src/glusterd.h            |    3 +-
 7 files changed, 73 insertions(+), 261 deletions(-)
 delete mode 100755 extras/ganesha/scripts/copy-export-ganesha.sh

diff --git a/extras/ganesha/scripts/Makefile.am b/extras/ganesha/scripts/Makefile.am
index c326fc2..224ed26 100644
--- a/extras/ganesha/scripts/Makefile.am
+++ b/extras/ganesha/scripts/Makefile.am
@@ -1,6 +1,6 @@
 EXTRA_DIST= ganesha-ha.sh dbus-send.sh create-export-ganesha.sh \
-            generate-epoch.py copy-export-ganesha.sh
+            generate-epoch.py
 
 scriptsdir = $(libexecdir)/ganesha
 scripts_SCRIPTS = create-export-ganesha.sh dbus-send.sh ganesha-ha.sh \
-                  generate-epoch.py copy-export-ganesha.sh
+                  generate-epoch.py
diff --git a/extras/ganesha/scripts/copy-export-ganesha.sh b/extras/ganesha/scripts/copy-export-ganesha.sh
deleted file mode 100755
index 9c4afa0..0000000
--- a/extras/ganesha/scripts/copy-export-ganesha.sh
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/bin/bash
-
-#This script is called by glusterd when in case of
-#reboot.An export file specific to a volume
-#is copied in GANESHA_DIR/exports from online node.
-
-# Try loading the config from any of the distro
-# specific configuration locations
-if [ -f /etc/sysconfig/ganesha ]
-        then
-        . /etc/sysconfig/ganesha
-fi
-if [ -f /etc/conf.d/ganesha ]
-        then
-        . /etc/conf.d/ganesha
-fi
-if [ -f /etc/default/ganesha ]
-        then
-        . /etc/default/ganesha
-fi
-
-GANESHA_DIR=${1%/}
-VOL=$2
-CONF=
-host=$(hostname -s)
-SECRET_PEM="/var/lib/glusterd/nfs/secret.pem"
-
-function check_cmd_status()
-{
-        if [ "$1" != "0" ]
-                 then
-                 rm -rf $GANESHA_DIR/exports/export.$VOL.conf
-                 exit 1
-        fi
-}
-
-
-if [ ! -d "$GANESHA_DIR/exports" ];
-        then
-        mkdir $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}
-
-#remove the old export entry from NFS-Ganesha
-#if already exported
-dbus-send --type=method_call --print-reply --system \
-          --dest=org.ganesha.nfsd /org/ganesha/nfsd/ExportMgr \
-          org.ganesha.nfsd.exportmgr.ShowExports \
-    | grep -w -q "/$VOL"
-if [ $? -eq 0 ]; then
-        removed_id=`cat $GANESHA_DIR/exports/export.$VOL.conf |\
-                grep Export_Id | awk -F"[=,;]" '{print$2}' | tr -d '[[:space:]]'`
-
-        dbus-send --print-reply --system --dest=org.ganesha.nfsd \
-        /org/ganesha/nfsd/ExportMgr org.ganesha.nfsd.exportmgr.RemoveExport \
-        uint16:$removed_id 2>&1
-fi
-
-ha_servers=$(pcs status | grep "Online:" | grep -o '\[.*\]' | sed -e 's/\[//' | sed -e 's/\]//')
-IFS=$' '
-for server in ${ha_servers} ; do
-        current_host=`echo $server | cut -d "." -f 1`
-        if [ $host != $current_host ]
-        then
-                scp -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i \
-                ${SECRET_PEM} $server:$GANESHA_DIR/exports/export.$VOL.conf \
-                $GANESHA_DIR/exports/export.$VOL.conf
-                break
-        fi
-done
-
-if ! (cat $CONF | grep  $VOL.conf\"$ )
-then
-echo "%include \"$GANESHA_DIR/exports/export.$VOL.conf\"" >> $CONF
-fi
diff --git a/xlators/mgmt/glusterd/src/glusterd-ganesha.c b/xlators/mgmt/glusterd/src/glusterd-ganesha.c
index 2406519..38fc1f6 100644
--- a/xlators/mgmt/glusterd/src/glusterd-ganesha.c
+++ b/xlators/mgmt/glusterd/src/glusterd-ganesha.c
@@ -427,42 +427,23 @@ create_export_config (char *volname, char **op_errstr)
                         CONFDIR, volname, NULL);
         ret = runner_run(&runner);
 
-        if (ret && op_errstr)
+        if (ret)
                 gf_asprintf (op_errstr, "Failed to create"
                             " NFS-Ganesha export config file.");
 
         return ret;
 }
 
-int
-copy_export_config (char *volname, char **op_errstr)
-{
-        runner_t                runner                     = {0,};
-        int                     ret                        = -1;
-
-        GF_ASSERT(volname);
-        runinit (&runner);
-        runner_add_args (&runner, "sh",
-                        GANESHA_PREFIX"/copy-export-ganesha.sh",
-                        CONFDIR, volname, NULL);
-        ret = runner_run(&runner);
-
-        if (ret && op_errstr)
-                gf_asprintf (op_errstr, "Failed to copy"
-                            " NFS-Ganesha export config file.");
-
-        return ret;
-}
 /* Exports and unexports a particular volume via NFS-Ganesha */
 int
-ganesha_manage_export (char *volname, char *value, char **op_errstr,
-                       gf_boolean_t reboot)
+ganesha_manage_export (dict_t *dict, char *value, char **op_errstr)
 {
         runner_t                 runner = {0,};
         int                      ret = -1;
         char                     str[1024];
         glusterd_volinfo_t      *volinfo = NULL;
         dict_t                  *vol_opts = NULL;
+        char                    *volname = NULL;
         xlator_t                *this    = NULL;
         glusterd_conf_t         *priv    = NULL;
         gf_boolean_t             option  = _gf_false;
@@ -474,10 +455,16 @@ ganesha_manage_export (char *volname, char *value, char **op_errstr,
         priv = this->private;
 
         GF_ASSERT (value);
+        GF_ASSERT (dict);
         GF_ASSERT (priv);
-        GF_VALIDATE_OR_GOTO (this->name, volname, out);
-
 
+        ret = dict_get_str (dict, "volname", &volname);
+        if (ret) {
+                gf_msg (this->name, GF_LOG_ERROR, errno,
+                        GD_MSG_DICT_GET_FAILED,
+                        "Unable to get volume name");
+                goto out;
+        }
         ret = gf_string2boolean (value, &option);
         if (ret == -1) {
                 gf_msg (this->name, GF_LOG_ERROR, EINVAL,
@@ -485,77 +472,54 @@ ganesha_manage_export (char *volname, char *value, char **op_errstr,
                 goto out;
         }
 
-        /* *
-         * Incase of reboot, following checks are already made before calling
-         * ganesha_manage_export. So it will be reductant do it again
-         */
-        if (!reboot) {
-                ret = glusterd_volinfo_find (volname, &volinfo);
-                if (ret) {
-                        gf_msg (this->name, GF_LOG_ERROR, EINVAL,
-                                GD_MSG_VOL_NOT_FOUND,
-                                FMTSTR_CHECK_VOL_EXISTS, volname);
-                        goto out;
-                }
+        ret = glusterd_volinfo_find (volname, &volinfo);
+        if (ret) {
+                gf_msg (this->name, GF_LOG_ERROR, EINVAL,
+                        GD_MSG_VOL_NOT_FOUND,
+                        FMTSTR_CHECK_VOL_EXISTS, volname);
+                goto out;
+        }
 
-                ret = glusterd_check_ganesha_export (volinfo);
-                if (ret && option) {
-                        if (op_errstr)
-                                gf_asprintf (op_errstr, "ganesha.enable "
-                                                     "is already 'on'.");
-                        ret = -1;
-                        goto out;
+        ret = glusterd_check_ganesha_export (volinfo);
+        if (ret && option) {
+                gf_asprintf (op_errstr, "ganesha.enable "
+                             "is already 'on'.");
+                ret = -1;
+                goto out;
 
-                }  else if (!option && !ret) {
-                        if (op_errstr)
-                                gf_asprintf (op_errstr, "ganesha.enable "
-                                                    "is already 'off'.");
-                        ret = -1;
-                        goto out;
-                }
+        }  else if (!option && !ret) {
+                gf_asprintf (op_errstr, "ganesha.enable "
+                                    "is already 'off'.");
+                ret = -1;
+                goto out;
         }
 
-        ret = 0;
-
-        /* *
-         * Incase of restart, there is chance that global option turned off
-         * with volume set command. Still we may need to clean up the
-         * configuration files.
-         * Otherwise check if global option is enabled, only then proceed
-         * */
-        if (!(reboot && !option)) {
-                ret = dict_get_str_boolean (priv->opts,
+        /* Check if global option is enabled, proceed only then */
+        ret = dict_get_str_boolean (priv->opts,
                             GLUSTERD_STORE_KEY_GANESHA_GLOBAL, _gf_false);
-                if (ret == -1) {
-                        gf_msg_debug (this->name, 0, "Failed to get "
-                                                "global option dict.");
-                        if (op_errstr)
-                                gf_asprintf (op_errstr, "The option "
-                                             "nfs-ganesha should be "
-                                             "enabled before setting "
-                                             "ganesha.enable.");
-                        goto out;
-                }
-                if (!ret) {
-                        if (op_errstr)
-                                gf_asprintf (op_errstr, "The option "
-                                             "nfs-ganesha should be "
-                                             "enabled before setting "
-                                             "ganesha.enable.");
-                        ret = -1;
-                        goto out;
-                }
+        if (ret == -1) {
+                gf_msg_debug (this->name, 0, "Failed to get "
+                        "global option dict.");
+                gf_asprintf (op_errstr, "The option "
+                             "nfs-ganesha should be "
+                             "enabled before setting ganesha.enable.");
+                goto out;
         }
+        if (!ret) {
+                gf_asprintf (op_errstr, "The option "
+                             "nfs-ganesha should be "
+                             "enabled before setting ganesha.enable.");
+                ret = -1;
+                goto out;
+        }
+
         /* Create the export file only when ganesha.enable "on" is executed */
          if (option) {
-                if (reboot)
-                       ret  =  copy_export_config (volname, op_errstr);
-                else
-                       ret  =  create_export_config (volname, op_errstr);
+                ret  =  create_export_config (volname, op_errstr);
                 if (ret) {
                         gf_msg (this->name, GF_LOG_ERROR, 0,
                                 GD_MSG_EXPORT_FILE_CREATE_FAIL,
-                                "Failed to create/copy "
+                                "Failed to create"
                                 "export file for NFS-Ganesha\n");
                         goto out;
                 }
@@ -566,42 +530,25 @@ ganesha_manage_export (char *volname, char *value, char **op_errstr,
                          CONFDIR, value, volname, NULL);
                 ret = runner_run (&runner);
                 if (ret) {
-                        if (op_errstr)
-                                gf_asprintf(op_errstr, "Dynamic export"
-                                            " addition/deletion failed."
-                                            " Please see log file for details");
-                        /* *
-                         * Incase of reboot scenarios, we cannot guarantee
-                         * nfs-ganesha to be running on that node, so that
-                         * dynamic export may fail
-                         */
-                        if (reboot)
-                                ret = 0;
-                        else
-                                goto out;
+                        gf_asprintf(op_errstr, "Dynamic export"
+                                    " addition/deletion failed."
+                                    " Please see log file for details");
+                        goto out;
                 }
         }
 
+        vol_opts = volinfo->dict;
+        ret = dict_set_dynstr_with_alloc (vol_opts,
+                                 "features.cache-invalidation", value);
+        if (ret)
+                gf_asprintf (op_errstr, "Cache-invalidation could not"
+                                        " be set to %s.", value);
+        ret = glusterd_store_volinfo (volinfo,
+                        GLUSTERD_VOLINFO_VER_AC_INCREMENT);
+        if (ret)
+                gf_asprintf (op_errstr, "failed to store volinfo for %s"
+                             , volinfo->volname);
 
-        /* *
-         * cache-invalidation should be on when a volume is exported
-         * and off when a volume is unexported. It is not required
-         * for reboot scenarios, already it will be copied.
-         * */
-        if (!reboot) {
-                vol_opts = volinfo->dict;
-                ret = dict_set_dynstr_with_alloc (vol_opts,
-                                         "features.cache-invalidation", value);
-                if (ret && op_errstr)
-                        gf_asprintf (op_errstr, "Cache-invalidation could not"
-                                                " be set to %s.", value);
-                ret = glusterd_store_volinfo (volinfo,
-                                GLUSTERD_VOLINFO_VER_AC_INCREMENT);
-                if (ret && op_errstr)
-                        gf_asprintf (op_errstr, "failed to store volinfo for %s"
-                                     , volinfo->volname);
-
-        }
 out:
         return ret;
 }
@@ -862,9 +809,12 @@ glusterd_handle_ganesha_op (dict_t *dict, char **op_errstr,
                             char *key, char *value)
 {
 
-        int32_t                ret           = -1;
+        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);
@@ -873,15 +823,7 @@ glusterd_handle_ganesha_op (dict_t *dict, char **op_errstr,
 
 
         if (strcmp (key, "ganesha.enable") == 0) {
-                ret = dict_get_str (dict, "volname", &volname);
-                if (ret) {
-                        gf_msg (THIS->name, GF_LOG_ERROR, errno,
-                                GD_MSG_DICT_GET_FAILED,
-                                "Unable to get volume name");
-                        goto out;
-                }
-                ret =  ganesha_manage_export (volname, value, op_errstr,
-                                              _gf_false);
+                ret =  ganesha_manage_export (dict, value, op_errstr);
                 if (ret < 0)
                         goto out;
         }
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index 0521a9c..a228ba6 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -2163,7 +2163,7 @@ glusterd_op_reset_volume (dict_t *dict, char **op_rspstr)
                 quorum_action = _gf_true;
         ret = glusterd_check_ganesha_export (volinfo);
         if (ret) {
-                ret = ganesha_manage_export (volname, "off", op_rspstr, _gf_false);
+                ret = ganesha_manage_export (dict, "off", op_rspstr);
                 if (ret) {
                         gf_msg (THIS->name, GF_LOG_WARNING, 0,
                                 GD_MSG_NFS_GNS_RESET_FAIL,
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 375b965..bf27fe3 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -4093,9 +4093,6 @@ glusterd_import_friend_volume (dict_t *peer_data, size_t count)
         glusterd_volinfo_t      *old_volinfo = NULL;
         glusterd_volinfo_t      *new_volinfo = NULL;
         glusterd_svc_t          *svc         = NULL;
-        gf_boolean_t            newexportvalue;
-        gf_boolean_t            oldexportvalue;
-        char                    *value     = NULL;
 
         GF_ASSERT (peer_data);
 
@@ -4116,8 +4113,6 @@ glusterd_import_friend_volume (dict_t *peer_data, size_t count)
 
         ret = glusterd_volinfo_find (new_volinfo->volname, &old_volinfo);
         if (0 == ret) {
-                oldexportvalue = glusterd_check_ganesha_export (old_volinfo);
-
                 /* Ref count the old_volinfo such that deleting it doesn't crash
                  * if its been already in use by other thread
                  */
@@ -4151,33 +4146,6 @@ glusterd_import_friend_volume (dict_t *peer_data, size_t count)
                 }
         }
 
-        ret = glusterd_volinfo_get (new_volinfo, "ganesha.enable", &value);
-        if (ret)
-                goto out;
-        ret = gf_string2boolean (value, &newexportvalue);
-        if (ret)
-                goto out;
-
-        /* *
-         * if new and old export value is off, then there is no point in calling
-         * ganesha_manage_export
-         */
-        if (!((newexportvalue == oldexportvalue) &&
-               newexportvalue == _gf_false)) {
-                ret = ganesha_manage_export (new_volinfo->volname, value,
-                                             NULL, _gf_true);
-                if (ret) {
-                        gf_msg (this->name, GF_LOG_ERROR, 0,
-                                GD_MSG_NFS_GNS_OP_HANDLE_FAIL,
-                                "Returning from ganesha_manage_export with"
-                                " ret: %d for volume %s ganesha.enable %s",
-                                ret, new_volinfo->volname,
-                                value);
-                        gf_event (EVENT_NFS_GANESHA_EXPORT_FAILED, "volume=%s",
-                                  new_volinfo->volname);
-                        goto out;
-                }
-        }
         ret = glusterd_store_volinfo (new_volinfo, GLUSTERD_VOLINFO_VER_AC_NONE);
         if (ret) {
                 gf_msg (this->name, GF_LOG_ERROR, 0,
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
index 204ea3f..fcb4b3e 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
@@ -1697,7 +1697,7 @@ glusterd_op_stage_stop_volume (dict_t *dict, char **op_errstr)
         }
         ret = glusterd_check_ganesha_export (volinfo);
         if (ret) {
-                ret = ganesha_manage_export (volname, "off", op_errstr, _gf_false);
+                ret = ganesha_manage_export(dict, "off", op_errstr);
                 if (ret) {
                         gf_msg (THIS->name, GF_LOG_WARNING, 0,
                                 GD_MSG_NFS_GNS_UNEXPRT_VOL_FAIL, "Could not "
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index 8013c58..84b38e5 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -1072,8 +1072,7 @@ int glusterd_check_ganesha_cmd (char *key, char *value,
                                 char **errstr, dict_t *dict);
 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 (char *volname, char *value, char **op_errstr,
-                           gf_boolean_t reboot);
+int ganesha_manage_export (dict_t *dict, 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