--- /dev/null
+#!/bin/sh
+# script to manage nfs in a clustered environment
+
+start_nfs() {
+ /bin/mkdir -p $CTDB_VARDIR/state/nfs
+ /bin/mkdir -p $CTDB_VARDIR/state/statd/ip
+ ctdb_service_stop
+ ctdb_service_start
+ echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
+}
+
+. $CTDB_BASE/functions
+
+loadconfig nfs
+
+[ "$NFS_SERVER_MODE" == "GANESHA" ] || exit 0
+
+service_name="nfs-ganesha-gpfs"
+
+ctdb_start_stop_service
+
+is_ctdb_managed_service || exit 0
+
+case "$1" in
+ init)
+ # read statd from persistent database
+ ;;
+ startup)
+ ctdb_service_start
+ mkdir -p $CTDB_VARDIR/state/statd
+ touch $CTDB_VARDIR/state/statd/update-trigger
+ ;;
+
+ shutdown)
+ ctdb_service_stop
+ ;;
+
+ takeip)
+ ctdb_service_set_reconfigure
+ ;;
+
+ releaseip)
+ ctdb_service_set_reconfigure
+ ;;
+
+ monitor)
+ if ctdb_service_needs_reconfigure ; then
+ ctdb_service_reconfigure
+ exit 0
+ fi
+
+ update_tickles 2049
+
+ # check that statd responds to rpc requests
+ # if statd is not running we try to restart it
+ if ctdb_check_rpc "STATD" status 1 >/dev/null ; then
+ (service_name="nfs_statd"; ctdb_counter_init)
+ else
+ p="rpc.statd" ; cmd="$p"
+ cmd="${cmd}${STATD_HOSTNAME:+ -n }${STATD_HOSTNAME}"
+ cmd="${cmd}${STATD_PORT:+ -p }${STATD_PORT}"
+ cmd="${cmd}${STATD_OUTGOING_PORT:+ -o }${STATD_OUTGOING_PORT}"
+ (
+ service_name="nfs_statd"
+ ctdb_counter_incr
+ ctdb_check_counter_limit 10 quiet >/dev/null
+ ) || {
+ echo "$ctdb_check_rpc_out"
+ echo "Trying to restart STATD [$cmd]"
+ }
+ $cmd
+ fi
+
+ # check that NFS responds to rpc requests
+ [ "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" = "yes" ] || {
+ if ctdb_check_rpc "NFS" nfs 3 >/dev/null ; then
+ (service_name="nfs_knfsd"; ctdb_counter_init)
+ else
+ (
+ service_name="nfs_knfsd"
+ ctdb_counter_incr
+
+ ctdb_check_counter_equal 10 || {
+ echo "Trying to restart NFS service"
+ ctdb_service_stop
+ ctdb_service_start
+ exit 0
+ }
+
+ ctdb_check_counter_limit 15 quiet >/dev/null
+ ) || {
+ echo "$ctdb_check_rpc_out"
+ echo "Trying to restart NFS service"
+ ctdb_service_stop
+ ctdb_service_start
+ exit 1
+ }
+ fi
+ }
+
+ # and that its directories are available
+ [ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
+ grep Path /etc/ganesha/gpfs.ganesha.exports.conf |
+ cut -f2 -d\" | ctdb_check_directories
+ } || exit $?
+
+ # check that lockd responds to rpc requests
+ ctdb_check_rpc "LOCKD" nlockmgr 4 || {
+ echo "Trying to restart lock manager service"
+ ctdb_service_stop
+ ctdb_service_start
+ exit 1
+ }
+
+ # check mounts responds to rpc requests
+ ctdb_check_rpc "MOUNTD" mountd 1 >/dev/null || {
+ echo "Trying to restart mountd service"
+ ctdb_service_stop
+ ctdb_service_start
+ exit 1
+ }
+
+ # rquotad needs special handling since it is sometimes not started
+ # correctly on RHEL5
+ # this is not a critical service so we dont flag the node as unhealthy
+ ctdb_check_rpc "RQUOTAD" rquotad 1 || {
+ p="rpc.rquotad"
+ cmd="${p}${RQUOTAD_PORT:+ -p }${RQUOTAD_PORT}"
+ echo "Trying to restart RQUOTAD [${cmd}]"
+ killall -q -9 $p
+ $cmd &
+ }
+
+ # once every 60 seconds, update the statd state database for which
+ # clients need notifications
+ LAST_UPDATE=`stat --printf="%Y" $CTDB_VARDIR/state/statd/update-trigger 2>/dev/null`
+ CURRENT_TIME=`date +"%s"`
+ [ $CURRENT_TIME -ge $(($LAST_UPDATE + 60)) ] && {
+ mkdir -p $CTDB_VARDIR/state/statd
+ touch $CTDB_VARDIR/state/statd/update-trigger
+ $CTDB_BASE/statd-callout updatelocal &
+ $CTDB_BASE/statd-callout updateremote &
+ }
+ ;;
+
+ ipreallocated)
+ # if the ips have been reallocated, we must restart the lockmanager
+ # across all nodes and ping all statd listeners
+ [ -x $CTDB_BASE/statd-callout ] && {
+ $CTDB_BASE/statd-callout notify &
+ } >/dev/null 2>&1
+ ;;
+ *)
+ ctdb_standard_event_handler "$@"
+ ;;
+esac
+
+exit 0