# 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/

Reply via email to