summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/ganesha/scripts/Makefile.am4
-rwxr-xr-xextras/ganesha/scripts/copy-export-ganesha.sh97
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-ganesha.c194
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-op-sm.c2
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c32
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volume-ops.c2
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h3
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);