2 # script to manage nfs in a clustered environment
5 /bin/mkdir -p $CTDB_VARDIR/state/nfs
6 /bin/mkdir -p $CTDB_VARDIR/state/statd/ip
9 echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
12 . $CTDB_BASE/functions
15 service_start="start_nfs"
16 service_stop="startstop_nfs stop"
20 [ "$NFS_SERVER_MODE" != "GANESHA" ] || exit 0
22 ctdb_start_stop_service
24 is_ctdb_managed_service || exit 0
28 # read statd from persistent database
32 mkdir -p $CTDB_VARDIR/state/statd
33 touch $CTDB_VARDIR/state/statd/update-trigger
41 ctdb_service_set_reconfigure
45 ctdb_service_set_reconfigure
49 if ctdb_service_needs_reconfigure ; then
50 ctdb_service_reconfigure
56 # check that statd responds to rpc requests
57 # if statd is not running we try to restart it
58 # we only do this IF we have a rpc.statd command.
59 # For platforms where rpc.statd does not exist, we skip
60 # the check completely
62 which $p >/dev/null 2>/dev/null && {
63 if ctdb_check_rpc "STATD" 100024 1 >/dev/null ; then
64 (service_name="nfs_statd"; ctdb_counter_init)
67 cmd="${cmd}${STATD_HOSTNAME:+ -n }${STATD_HOSTNAME}"
68 cmd="${cmd}${STATD_PORT:+ -p }${STATD_PORT}"
69 cmd="${cmd}${STATD_OUTGOING_PORT:+ -o }${STATD_OUTGOING_PORT}"
71 service_name="nfs_statd"
73 ctdb_check_counter_limit 10 quiet >/dev/null
75 echo "$ctdb_check_rpc_out"
76 echo "Trying to restart STATD [$cmd]"
82 # check that NFS responds to rpc requests
83 [ "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" = "yes" ] || {
84 if ctdb_check_rpc "NFS" 100003 3 >/dev/null ; then
85 (service_name="nfs_knfsd"; ctdb_counter_init)
88 service_name="nfs_knfsd"
91 ctdb_check_counter_equal 10 || {
92 echo "Trying to restart NFS service"
93 startstop_nfs restart >/dev/null 2>&1 &
97 ctdb_check_counter_limit 15 quiet >/dev/null
99 echo "$ctdb_check_rpc_out"
100 echo "Trying to restart NFS service"
101 startstop_nfs restart
107 # and that its directories are available
108 [ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
109 exportfs | grep -v '^#' | grep '^/' |
110 sed -e 's/[[:space:]]\+[^[:space:]]*$//' |
111 ctdb_check_directories
114 # check that lockd responds to rpc requests
115 if ctdb_check_rpc "LOCKD" 100021 1 >/dev/null ; then
116 (service_name="lockd"; ctdb_counter_init)
122 ctdb_check_counter_equal 10 || {
123 echo "Trying to restart NFS lock service"
124 startstop_nfs restart >/dev/null 2>&1 &
125 startstop_nfslock restart >/dev/null 2>&1 &
129 ctdb_check_counter_limit 15 quiet >/dev/null
131 echo "$ctdb_check_rpc_out"
132 echo "Trying to restart NFS lock service"
133 startstop_nfs restart
134 startstop_nfslock restart
139 # mount needs special handling since it is sometimes not started
141 if ctdb_check_rpc "MOUNTD" 100005 1 >/dev/null ; then
142 (service_name="nfs_mountd"; ctdb_counter_init)
145 service_name="nfs_mountd"
148 ctdb_check_counter_equal 5 || {
150 cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
151 echo "Trying to restart MOUNTD [${cmd}]"
157 ctdb_check_counter_limit 10 quiet >/dev/null
159 echo "$ctdb_check_rpc_out"
161 cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
162 echo "Trying to restart MOUNTD [${cmd}]"
170 # rquotad needs special handling since it is sometimes not started
172 # this is not a critical service so we dont flag the node as unhealthy
173 ctdb_check_rpc "RQUOTAD" 100011 1 || {
175 cmd="${p}${RQUOTAD_PORT:+ -p }${RQUOTAD_PORT}"
176 echo "Trying to restart RQUOTAD [${cmd}]"
181 # once every 60 seconds, update the statd state database for which
182 # clients need notifications
183 LAST_UPDATE=`stat --printf="%Y" $CTDB_VARDIR/state/statd/update-trigger 2>/dev/null`
184 CURRENT_TIME=`date +"%s"`
185 [ $CURRENT_TIME -ge $(($LAST_UPDATE + 60)) ] && {
186 mkdir -p $CTDB_VARDIR/state/statd
187 touch $CTDB_VARDIR/state/statd/update-trigger
188 $CTDB_BASE/statd-callout updatelocal &
189 $CTDB_BASE/statd-callout updateremote &
194 # if the ips have been reallocated, we must restart the lockmanager
195 # across all nodes and ping all statd listeners
196 [ -x $CTDB_BASE/statd-callout ] && {
197 $CTDB_BASE/statd-callout notify &
201 ctdb_standard_event_handler "$@"