# HG changeset patch
# User Florian Haas <[email protected]>
# Date 1287154687 -7200
# Node ID 50a340003ffe0310c08425b73c141e96c42b468f
# Parent 80aa4855038042b7f263df775d281138a1ba658b
High: exportfs: cleanup
Give the exportfs RA a hearty makeover:
* Do away with the odd background "backup" job.
* Stop copying a filtered rmtab into the root of the export.
* Don't specifically look into the etab to figure out what
is currently exported, just ask exportfs and parse its output.
* Actually check whether the export already (or still) exists
during start and stop.
diff -r 80aa48550380 -r 50a340003ffe heartbeat/exportfs
--- a/heartbeat/exportfs Fri Oct 15 16:58:07 2010 +0200
+++ b/heartbeat/exportfs Fri Oct 15 16:58:07 2010 +0200
@@ -141,31 +141,34 @@
END
}
-backup_rmtab ()
-{
- grep :${OCF_RESKEY_directory}: $RMTAB > $FS_RMTAB
-}
-
-clean_rmtab ()
-{
- REMOVE=`echo ${OCF_RESKEY_directory} | sed 's/\//\\\\\//g'`
- sed -i -e /:${REMOVE}:/d $RMTAB
-}
-
exportfs_monitor ()
{
- grep -qs "${OCF_RESKEY_directory}" $ETAB
+ # "grep -z" matches across newlines, which is necessary as
+ # exportfs output wraps lines for long export directory names
+ exportfs | grep -zqs
"${OCF_RESKEY_directory}[[:space:]]*${OCF_RESKEY_clientspec}"
#Adapt grep status code to OCF return code
case $? in
- 0) return $OCF_SUCCESS;;
- 1) return $OCF_NOT_RUNNING;;
- *) return $OCF_ERR_GENERIC;;
+ 0)
+ ocf_log info "Directory ${OCF_RESKEY_directory} is exported to
${OCF_RESKEY_clientspec} (started)."
+ return $OCF_SUCCESS
+ ;;
+ 1)
+ ocf_log info "Directory ${OCF_RESKEY_directory} is not exported
to ${OCF_RESKEY_clientspec} (stopped)."
+ return $OCF_NOT_RUNNING;;
+ *)
+ ocf_log err "Unable to determine export status for
${OCF_RESKEY_directory}."
+ return $OCF_ERR_GENERIC;;
esac
}
exportfs_start ()
{
+ if exportfs_monitor; then
+ ocf_log debug "${OCF_RESKEY_directory} already exported"
+ return $OCF_SUCCESS
+ fi
+
ocf_log info "Exporting file system ..."
if [ ${OCF_RESKEY_options} ]; then
@@ -183,52 +186,23 @@
ocf_run exportfs -v ${OPTIONS}
${OCF_RESKEY_clientspec}:${OCF_RESKEY_directory} || exit $OCF_ERR_GENERIC
- RETRIES=0
- while [ 1 ]; do
- showmount -e |
- awk -v export="$OCF_RESKEY_directory" -v
client="$OCF_RESKEY_clientspec" '
- $1 == export {
- if( $2 == "(everyone)" ) exit 1
- split($2,clients,",")
- for ( i in clients ) {
- if( clients[i] == client ) exit 1
- }
- }'
- [ $? -eq 1 ] && break
- RETRIES=`expr ${RETRIES} + 1`
- if [ ${RETRIES} -eq 4 ]; then
- ocf_log debug "Export not reported by showmount -e"
- ocf_log err "Export not reported by showmount -e"
- return ${OCF_NOT_RUNNING}
- fi
- sleep 1
- done
-
- #restore saved rmtab backup from other server:
- if [ -f $FS_RMTAB ]; then
- cat $FS_RMTAB >> $RMTAB
- rm -f $FS_RMTAB
- fi
-
- #spawn our background process to backup the rmtab each 2 seconds
- /bin/sh $0 backup &
-
ocf_log info "File system exported"
return $OCF_SUCCESS
}
exportfs_stop ()
{
+ exportfs_monitor
+ if [ $? -eq $OCF_NOT_RUNNING ]; then
+ ocf_log debug "${OCF_RESKEY_directory} not exported"
+ return $OCF_SUCCESS
+ fi
+
ocf_log info "Un-exporting file system ..."
ocf_run exportfs -v -u ${OCF_RESKEY_clientspec}:${OCF_RESKEY_directory}
rc=$?
- if [ -f $PIDF ]; then
- kill `cat $PIDF`
- rm $PIDF
- fi
-
if ocf_is_true ${OCF_RESKEY_unlock_on_stop}; then
local unlockfile
unlockfile=/proc/fs/nfsd/unlock_filesystem
@@ -253,9 +227,6 @@
fi
fi
- backup_rmtab
- clean_rmtab
-
if [ $rc -eq 0 ]; then
ocf_log info "Un-exported file system"
return $OCF_SUCCESS
@@ -265,15 +236,6 @@
exit $OCF_ERR_GENERIC
}
-exportfs_backup ()
-{
- echo $$ > $PIDF
- while [ 1 ]; do
- backup_rmtab
- sleep 2
- done
-}
-
exportfs_validate ()
{
# Checks for required parameters
@@ -304,11 +266,6 @@
exit $OCF_ERR_ARGS
fi
-ETAB=/var/lib/nfs/etab
-RMTAB=/var/lib/nfs/rmtab
-PIDF=${OCF_RESKEY_directory}/.exportfs_backup.pid
-FS_RMTAB=${OCF_RESKEY_directory}/.rmtab
-
case $__OCF_ACTION in
meta-data) exportfs_meta_data
exit $OCF_SUCCESS
@@ -329,8 +286,6 @@
;;
status|monitor) exportfs_monitor
;;
- backup) exportfs_backup
- ;;
validate-all)
# nothing to do -- we're already validated
;;
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/