2 # script to manage nfs in a clustered environment
5 mkdir -p $CTDB_VARDIR/state/nfs
6 mkdir -p $CTDB_VARDIR/state/statd/ip
9 set_proc "sys/net/ipv4/tcp_tw_recycle" 1
12 . $CTDB_BASE/functions
15 service_start="start_nfs"
16 service_stop="startstop_nfs stop"
17 service_reconfigure="startstop_nfs restart"
21 [ "$NFS_SERVER_MODE" != "GANESHA" ] || exit 0
23 ctdb_start_stop_service
25 is_ctdb_managed_service || exit 0
29 # read statd from persistent database
33 mkdir -p $CTDB_VARDIR/state/statd
34 touch $CTDB_VARDIR/state/statd/update-trigger
42 ctdb_service_set_reconfigure
46 ctdb_service_set_reconfigure
50 # and that its directories are available
51 [ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
52 exportfs | grep -v '^#' | grep '^/' |
53 sed -e 's/[[:space:]]\+[^[:space:]]*$//' |
54 ctdb_check_directories
57 if ctdb_service_needs_reconfigure ; then
58 ctdb_service_reconfigure
64 # check that statd responds to rpc requests
65 # if statd is not running we try to restart it
66 # we only do this IF we have a rpc.statd command.
67 # For platforms where rpc.statd does not exist, we skip
68 # the check completely
70 which $p >/dev/null 2>/dev/null && {
71 if ctdb_check_rpc "STATD" 100024 1 >/dev/null ; then
72 (service_name="nfs_statd"; ctdb_counter_init)
75 cmd="${cmd}${STATD_HOSTNAME:+ -n }${STATD_HOSTNAME}"
76 cmd="${cmd}${STATD_PORT:+ -p }${STATD_PORT}"
77 cmd="${cmd}${STATD_OUTGOING_PORT:+ -o }${STATD_OUTGOING_PORT}"
79 service_name="nfs_statd"
81 ctdb_check_counter_limit 10 quiet >/dev/null
83 echo "$ctdb_check_rpc_out"
84 echo "Trying to restart STATD [$cmd]"
90 # check that NFS responds to rpc requests
91 [ "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" = "yes" ] || {
92 if ctdb_check_rpc "NFS" 100003 3 >/dev/null ; then
93 (service_name="nfs_knfsd"; ctdb_counter_init)
96 service_name="nfs_knfsd"
99 ctdb_check_counter_equal 2 || {
100 echo "Trying to restart NFS service"
101 startstop_nfs restart >/dev/null 2>&1 &
105 ctdb_check_counter_limit 5 quiet >/dev/null
107 echo "$ctdb_check_rpc_out"
108 echo "Trying to restart NFS service"
109 startstop_nfs restart
115 # check that lockd responds to rpc requests
116 if ctdb_check_rpc "LOCKD" 100021 1 >/dev/null ; then
117 (service_name="lockd"; ctdb_counter_init)
123 ctdb_check_counter_equal 10 || {
124 echo "Trying to restart NFS lock service"
125 startstop_nfs restart >/dev/null 2>&1 &
126 startstop_nfslock restart >/dev/null 2>&1 &
130 ctdb_check_counter_limit 15 quiet >/dev/null
132 echo "$ctdb_check_rpc_out"
133 echo "Trying to restart NFS lock service"
134 startstop_nfs restart
135 startstop_nfslock restart
140 # mount needs special handling since it is sometimes not started
142 if ctdb_check_rpc "MOUNTD" 100005 1 >/dev/null ; then
143 (service_name="nfs_mountd"; ctdb_counter_init)
146 service_name="nfs_mountd"
149 ctdb_check_counter_equal 5 || {
151 cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
152 echo "Trying to restart MOUNTD [${cmd}]"
158 ctdb_check_counter_limit 10 quiet >/dev/null
160 echo "$ctdb_check_rpc_out"
162 cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
163 echo "Trying to restart MOUNTD [${cmd}]"
171 # rquotad needs special handling since it is sometimes not started
173 # this is not a critical service so we dont flag the node as unhealthy
174 ctdb_check_rpc "RQUOTAD" 100011 1 || {
176 cmd="${p}${RQUOTAD_PORT:+ -p }${RQUOTAD_PORT}"
177 echo "Trying to restart RQUOTAD [${cmd}]"
182 # once every 600 seconds, update the statd state database for which
183 # clients need notifications
184 LAST_UPDATE=`stat --printf="%Y" $CTDB_VARDIR/state/statd/update-trigger 2>/dev/null`
185 CURRENT_TIME=`date +"%s"`
186 [ $CURRENT_TIME -ge $(($LAST_UPDATE + 600)) ] && {
187 mkdir -p $CTDB_VARDIR/state/statd
188 touch $CTDB_VARDIR/state/statd/update-trigger
189 $CTDB_BASE/statd-callout updatelocal &
190 $CTDB_BASE/statd-callout updateremote &
195 # if the ips have been reallocated, we must restart the lockmanager
196 # across all nodes and ping all statd listeners
197 [ -x $CTDB_BASE/statd-callout ] && {
198 $CTDB_BASE/statd-callout notify &
202 ctdb_standard_event_handler "$@"