diff options
| -rw-r--r-- | extras/ganesha/scripts/Makefile.am | 4 | ||||
| -rwxr-xr-x | extras/ganesha/scripts/copy-export-ganesha.sh | 97 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-ganesha.c | 194 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 32 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 3 | 
7 files changed, 73 insertions, 261 deletions
diff --git a/extras/ganesha/scripts/Makefile.am b/extras/ganesha/scripts/Makefile.am index c326fc2f136..224ed26e75b 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 9c4afa02d68..00000000000 --- 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 badb4c2f067..728bfc627b0 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;  } @@ -863,9 +810,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); @@ -874,15 +824,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 5519d2f734c..f2f5a347b86 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 a458a1c9245..872475e9ab0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -4092,9 +4092,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_false; -        gf_boolean_t            oldexportvalue = _gf_false; -        char                    *value     = NULL;          GF_ASSERT (peer_data); @@ -4115,8 +4112,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                   */ @@ -4150,33 +4145,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 72e14b0429d..af1bd6d70d6 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 11b55cbb79d..daec281d979 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -1068,8 +1068,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);  | 
