2 # script to manage nfs in a clustered environment
4 [ -n "$CTDB_BASE" ] || \
5 export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD")
9 GANRECDIR="/var/lib/nfs/ganesha"
10 GANRECDIR2="/var/lib/nfs/ganesha/recevents"
11 GPFS_STATE="/usr/lpp/mmfs/bin/mmgetstate"
12 GANRECDIR3="/var/lib/nfs/ganesha_local"
17 startstop_ganesha stop
18 startstop_ganesha start
19 set_proc "sys/net/ipv4/tcp_tw_recycle" 1
24 startstop_ganesha stop
27 service_reconfigure ()
29 # if the ips have been reallocated, we must restart ganesha
30 # across all nodes and ping all statd listeners
31 [ -x $CTDB_BASE/statd-callout ] && {
32 $CTDB_BASE/statd-callout notify &
39 [ -n "$CTDB_CLUSTER_FILESYSTEM_TYPE" ] || CTDB_CLUSTER_FILESYSTEM_TYPE="gpfs"
41 service_name="nfs-ganesha-$CTDB_CLUSTER_FILESYSTEM_TYPE"
43 [ "${CTDB_NFS_SERVER_MODE:-${NFS_SERVER_MODE}}" = "ganesha" ] || exit 0
45 ctdb_setup_service_state_dir
47 ctdb_start_stop_service
49 is_ctdb_managed_service || exit 0
51 ctdb_service_check_reconfigure
53 get_cluster_fs_state ()
55 case $CTDB_CLUSTER_FILESYSTEM_TYPE in
57 STATE=`$GPFS_STATE | awk 'NR <= 3 {next} {printf "%-6s", $3}'`
61 die "File system $CTDB_CLUSTER_FILESYSTEM_TYPE not supported"
66 create_ganesha_recdirs ()
68 MOUNTS=$(mount -t $CTDB_CLUSTER_FILESYSTEM_TYPE)
69 if [ -z "$MOUNTS" ]; then
70 echo "startup $CTDB_CLUSTER_FILESYSTEM_TYPE not ready"
73 MNTPT=$(echo "$MOUNTS" | sort | awk 'NR == 1 {print $3}')
74 mkdir -p $MNTPT/.ganesha
75 if [ -e $GANRECDIR ]; then
76 if [ ! -L $GANRECDIR ] ; then
78 if ! ln -s $MNTPT/.ganesha $GANRECDIR ; then
83 if ! ln -sf $MNTPT/.ganesha $GANRECDIR ; then
92 monitor_ganesha_nfsd ()
94 create_ganesha_recdirs
95 service_name=${service_name}_process
97 PIDFILE="/var/run/ganesha.pid"
98 CUR_STATE=`get_cluster_fs_state`
99 GANESHA="/usr/bin/$CTDB_CLUSTER_FILESYSTEM_TYPE.ganesha.nfsd"
100 if { read PID < $PIDFILE && \
101 grep "$GANESHA" "/proc/$PID/cmdline" ; } >/dev/null 2>&1 ; then
102 ctdb_counter_init "$service_name"
104 if [ $CUR_STATE = "active" ]; then
105 echo "Trying fast restart of NFS service"
106 startstop_ganesha restart
107 ctdb_counter_incr "$service_name"
108 ctdb_check_counter "error" "-ge" "6" "$service_name"
112 service_name="nfs-ganesha-$CTDB_CLUSTER_FILESYSTEM_TYPE"_service
113 # check that NFS is posting forward progress
114 if [ $CUR_STATE = "active" -a "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" != "yes" ] ; then
119 NUMREDS=`ls $GANRECDIR3 | grep "red" | wc -l`
120 LASTONE=`ls -t $GANRECDIR3 | sed 's/_/ /' | awk 'NR > 1 {next} {printf $1} '`
122 if [ -z $LASTONE ] ; then
126 TSTALL=$(($TNOW - $LASTONE))
127 if [ $NUMREDS -ge $MAXREDS ] ; then
128 echo restarting because of $NUMREDS red conditions
130 ctdb_counter_incr "$service_name"
131 ctdb_check_counter "error" "-ge" "6" "$service_name"
133 if [ $TSTALL -ge $MAXSTALL ] ; then
134 echo restarting because of $TSTALL second stall
136 ctdb_counter_incr "$service_name"
137 ctdb_check_counter "error" "-ge" "6" "$service_name"
139 if [ $RESTART -gt 0 ] ; then
140 startstop_ganesha restart
142 ctdb_counter_init "$service_name"
147 ############################################################
151 # read statd from persistent database
154 create_ganesha_recdirs
163 if [ -n "$2" ] ; then
164 case $CTDB_CLUSTER_FILESYSTEM_TYPE in
166 NNUM=`/usr/lpp/mmfs/bin/mmlsconfig myNodeConfigNumber | awk '{print $2}'`
168 TOUCHTGT=$1"_"$TDATE"_"$NNUM"_"$3"_"$4"_"$2
169 touch $GANRECDIR2/$TOUCHTGT
173 ctdb_service_set_reconfigure
177 if [ -n "$2" ] ; then
178 case $CTDB_CLUSTER_FILESYSTEM_TYPE in
180 NNUM=`/usr/lpp/mmfs/bin/mmlsconfig myNodeConfigNumber | awk '{print $2}'`
182 TOUCHTGT=$1"_"$TDATE"_"$NNUM"_"$3"_"$4"_"$2
183 touch $GANRECDIR2/$TOUCHTGT
187 ctdb_service_set_reconfigure
191 # Check that directories for shares actually exist.
192 [ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
193 grep Path /etc/ganesha/$CTDB_CLUSTER_FILESYSTEM_TYPE.ganesha.exports.conf |
194 cut -f2 -d\" | sort -u | ctdb_check_directories
199 # check that statd responds to rpc requests
200 # if statd is not running we try to restart it
201 # we only do this IF we have a rpc.statd command.
202 # For platforms where rpc.statd does not exist, we skip
203 # the check completely
205 which $p >/dev/null 2>/dev/null && \
206 nfs_check_rpc_service "statd" \
207 -ge 6 "verbose unhealthy" \
208 -eq 4 "verbose restart" \
211 if [ "$CTDB_SKIP_GANESHA_NFSD_CHECK" != "yes" ] ; then
215 # rquotad is sometimes not started correctly on RHEL5
216 # not a critical service so we dont flag the node as unhealthy
217 nfs_check_rpc_service "rquotad" \
218 -gt 0 "verbose restart:b"
222 ctdb_standard_event_handler "$@"