Hi,

I recently discovered that the Linux-HA's Filesystem OCF resource agent doesn't work with GlusterFS. First, it needs "glusterfs" to be added to the list of non-block-device filesystems. Second, it fails the /proc/filesystems sanity check because it uses fuse. There may be additional issues.

Since I already have all my GlusterFS mount configurations stored in /etc/fstab (with noauto), I find it annoying that these setting need to be duplicated in cib.xml, and then the Filesystem agent needs to be modified to specially handle GlusterFS. Thus, I copied Filesystem, ripped out most of the code, and renamed it DumbFstabFilesystem. This version takes just the mount point as a parameter, and it doesn't do much of its own sanity checks other than making sure the mount point exists (which perhaps is still superfluous). I'm pasting it here in case anyone else would find it useful. I based it off the 2.1.3-3.el5.centos version.

-David

#!/bin/sh
#
# Support:      [email protected]
# License:      GNU General Public License (GPL)
#
# DumbFstabFilesystem
# Description: Manages a filesystem, relying on /etc/fstab to be properly configured.
#
# usage: ./DumbFstabFilesystem {start|stop|status|monitor|validate-all|meta-data}
#
#      OCF parameters are as below:
#        OCF_RESKEY_directory
#
#OCF_RESKEY_directory : the mount point for the filesystem
#
#
# Put this filesystem in /etc/fstab.
#

#######################################################################
# Initialization:

. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

#######################################################################
HOSTOS=`uname`

usage() {
   cat <<-EOT
   usage: $0 {start|stop|status|monitor|validate-all|meta-data}
   EOT
}

meta_data() {
   cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="DumbFstabFilesystem">
<version>1.0</version>

<longdesc lang="en">
Resource script for DumbFstabFilesystem. It manages a filesystem, relying on /etc/fstab to be properly configured.
</longdesc>
<shortdesc lang="en">DumbFstabFilesystem resource agent</shortdesc>

<parameters>
<parameter name="directory" required="1">
<longdesc lang="en">
The mount point for the filesystem.
</longdesc>
<shortdesc lang="en">mount point</shortdesc>
<content type="string" default="" />
</parameter>
</parameters>

<actions>
<action name="start" timeout="60" />
<action name="stop" timeout="60" />
<action name="notify" timeout="60" />
<action name="monitor" depth="0" timeout="40" interval="20" start-delay="10" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}

# Take advantage of /etc/mtab if present, use portable mount command
# otherwise. Normalize format to "dev mountpoint fstype".
list_mounts() {
   if [ -f "/etc/mtab" -a -r "/etc/mtab" ]; then
       cut -d' ' -f1,2,3 </etc/mtab
   else
       $MOUNT | cut -d' ' -f1,3,5
   fi
}

# Lists all filesystems potentially mounted under a given path,
# excluding the path itself.
list_submounts() {
   list_mounts | grep " $1/" | cut -d' ' -f2 | sort -r
}

#
# START: Start up the filesystem
#
Filesystem_start()
{
   # See if the device is already mounted.
   if Filesystem_status >/dev/null 2>&1 ; then
       ocf_log info "Filesystem $MOUNTPOINT is already mounted."
       return $OCF_SUCCESS
   fi

# Check the filesystem & auto repair. # NOTE: Some filesystem types don't need this step... Please modify
   #       accordingly

   if [ ! -d "$MOUNTPOINT" ] ; then
ocf_log err "Couldn't find directory [$MOUNTPOINT] to use as a mount point"
       exit $OCF_ERR_ARGS
   fi

   # Mount the filesystem.
   $MOUNT $MOUNTPOINT

       if [ $? -ne 0 ]; then
       ocf_log err "Couldn't mount filesystem on $MOUNTPOINT"
       return $OCF_ERR_GENERIC
   fi

   return 0
}
# end of Filesystem_start


#
# STOP: Unmount the filesystem
#
Filesystem_stop()
{
   # See if the device is currently mounted
   Filesystem_status >/dev/null 2>&1
   if [ $? -eq $OCF_NOT_RUNNING ]; then
       # Already unmounted, wonderful.
       rc=$OCF_SUCCESS
   else
       # For networked filesystems, we might want to add -f

       # Umount all sub-filesystems mounted under $MOUNTPOINT/ too.
       for SUB in `list_submounts $MOUNTPOINT` $MOUNTPOINT; do
           ocf_log info "Trying to unmount $MOUNTPOINT"
           for sig in SIGTERM SIGTERM SIGTERM SIGKILL SIGKILL SIGKILL; do
               if $UMOUNT $SUB ; then
                   rc=$OCF_SUCCESS
                   ocf_log info "unmounted $SUB successfully"
                   break
               else
                   rc=$OCF_ERR_GENERIC
ocf_log err "Couldn't unmount $SUB; trying cleanup with $sig"
                   # fuser returns a non-zero return code if none of the
                   # specified files is accessed or in case of a fatal
                   # error.
                   if [ "X${HOSTOS}" = "XOpenBSD" ];then
                       PIDS=`fstat | grep ${SUB} | awk '{print $3}'`
                       for PID in ${PIDS};do
                           kill -9 ${PID}
                           ocf_log info "Sent kill -9 to ${PID}"
                       done
                   else
                       if $FUSER -$sig -m -k $SUB ; then
ocf_log info "Some processes on $SUB were signalled"
                       else
ocf_log info "No processes on $SUB were signalled"
                       fi
                   fi
                   sleep 1
               fi
           done

           if [ $rc -ne $OCF_SUCCESS ]; then
               ocf_log err "Couldn't unmount $SUB, giving up!"
           fi
       done
   fi

   return $rc
}
# end of Filesystem_stop

#
# STATUS: is the filesystem mounted or not?
#
Filesystem_status()
{
   if list_mounts | grep -q " $MOUNTPOINT " >/dev/null 2>&1; then
       rc=$OCF_SUCCESS
       msg="$MOUNTPOINT is mounted (running)"
       else
       rc=$OCF_NOT_RUNNING
       msg="$MOUNTPOINT is unmounted (stopped)"
       fi

   # Special case "monitor" to check whether the UUID cached and
   # on-disk still match?
case "$OP" in
   status)    ocf_log info "$msg";;
   esac

       return $rc
}
# end of Filesystem_status

#
# VALIDATE_ALL: Are the instance parameters valid?
#    FIXME!!  The only part that's useful is the return code.
#    This code always returns $OCF_SUCCESS (!)
#
Filesystem_validate_all()
{
   if [ -n $MOUNTPOINT -a ! -d $MOUNTPOINT ]; then
       ocf_log warn "Mountpoint $MOUNTPOINT does not exist"
   fi

   return $OCF_SUCCESS
}

# Check the arguments passed to this script
if [ $# -ne 1 ]; then
   usage
   exit $OCF_ERR_ARGS
fi

# Check the OCF_RESKEY_ environment variables...

OP=$1

# These operations do not require instance parameters
case $OP in
meta-data)    meta_data
       exit $OCF_SUCCESS
       ;;
usage)        usage
       exit $OCF_SUCCESS
       ;;
esac


# Normalize instance parameters:

# It is possible that OCF_RESKEY_directory has one or even multiple trailing "/".
# But the output of `mount` and /proc/mounts do not.
if [ -z "$OCF_RESKEY_directory" ]; then
   ocf_log err "Please specify the directory"
   exit $OCF_ERR_ARGS
else
   MOUNTPOINT=$(echo $OCF_RESKEY_directory | sed 's/\/*$//')
   : ${MOUNTPOINT:=/}
# At this stage, $MOUNTPOINT does not contain trailing "/" unless it is "/"
   # TODO: / mounted via Filesystem sounds dangerous. On stop, we'll
   # kill the whole system. Is that a good idea?
fi
# Check to make sure the utilites are found
if [ "X${HOSTOS}" != "XOpenBSD" ];then
   check_binary $FUSER
fi
check_binary $MOUNT
check_binary $UMOUNT

if [ "$OP" != "monitor" ]; then
   ocf_log info "Running $OP on $MOUNTPOINT"
fi

# These operations do not require the clone checking + OCFS2
# initialization.
case $OP in
status|monitor)    Filesystem_status
       exit $?
       ;;
validate-all)    Filesystem_validate_all
       exit $?
       ;;
stop)        Filesystem_stop
       exit $?
       ;;
start)        Filesystem_start
       ;;
notify)        exit $OCF_SUCCESS
       ;;
*)        usage
       exit $OCF_ERR_UNIMPLEMENTED
       ;;
esac
exit $?
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems

Reply via email to