make changes to ctdb event scripts to support NFS-Ganesha.
[sahlberg/ctdb.git] / config / events.d / 60.nfs
1 #!/bin/sh
2 # script to manage nfs in a clustered environment
3
4 start_nfs() {
5         /bin/mkdir -p $CTDB_VARDIR/state/nfs
6         /bin/mkdir -p $CTDB_VARDIR/state/statd/ip
7         startstop_nfs stop
8         startstop_nfs start
9         echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
10 }
11
12 . $CTDB_BASE/functions
13
14 service_name="nfs"
15 service_start="start_nfs"
16 service_stop="startstop_nfs stop"
17
18 loadconfig
19
20 [ "$NFS_SERVER_MODE" != "GANESHA" ] || exit 0
21
22 ctdb_start_stop_service
23
24 is_ctdb_managed_service || exit 0
25
26 case "$1" in 
27      init)
28         # read statd from persistent database
29         ;;
30      startup)
31         ctdb_service_start
32         mkdir -p $CTDB_VARDIR/state/statd
33         touch $CTDB_VARDIR/state/statd/update-trigger
34         ;;
35
36      shutdown)
37         ctdb_service_stop
38         ;;
39
40      takeip)
41         ctdb_service_set_reconfigure
42         ;;
43
44      releaseip)
45         ctdb_service_set_reconfigure
46         ;;
47
48       monitor)
49         if ctdb_service_needs_reconfigure ; then
50             ctdb_service_reconfigure
51             exit 0
52         fi
53
54         update_tickles 2049
55
56         # check that statd responds to rpc requests
57         # if statd is not running we try to restart it
58         if ctdb_check_rpc "STATD" 100024 1 >/dev/null ; then
59                 (service_name="nfs_statd"; ctdb_counter_init)
60         else
61                 p="rpc.statd" ; cmd="$p"
62                 cmd="${cmd}${STATD_HOSTNAME:+ -n }${STATD_HOSTNAME}"
63                 cmd="${cmd}${STATD_PORT:+ -p }${STATD_PORT}"
64                 cmd="${cmd}${STATD_OUTGOING_PORT:+ -o }${STATD_OUTGOING_PORT}"
65                 (
66                         service_name="nfs_statd"
67                         ctdb_counter_incr
68                         ctdb_check_counter_limit 10 quiet >/dev/null
69                 ) || {
70                         echo "$ctdb_check_rpc_out"
71                         echo "Trying to restart STATD [$cmd]"
72                 }
73                 $cmd
74         fi
75
76
77         # check that NFS responds to rpc requests
78         [ "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" = "yes" ] || {
79             if ctdb_check_rpc "NFS" 100003 3 >/dev/null ; then
80                 (service_name="nfs_knfsd"; ctdb_counter_init)
81             else
82                 (
83                         service_name="nfs_knfsd"
84                         ctdb_counter_incr
85
86                         ctdb_check_counter_equal 10 || {
87                                 echo "Trying to restart NFS service"
88                                 startstop_nfs restart >/dev/null 2>&1 &
89                                 exit 0
90                         }
91
92                         ctdb_check_counter_limit 15 quiet >/dev/null
93                 ) || {
94                         echo "$ctdb_check_rpc_out"
95                         echo "Trying to restart NFS service"
96                         startstop_nfs restart
97                         exit 1
98                 }
99             fi
100         }
101
102         # and that its directories are available
103         [ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
104             exportfs | grep -v '^#' | grep '^/' |
105             sed -e 's/[[:space:]]\+[^[:space:]]*$//' |
106             ctdb_check_directories
107         } || exit $?
108
109         # check that lockd responds to rpc requests
110         ctdb_check_rpc "LOCKD" 100021 1 || {
111                 echo "Trying to restart lock manager service"
112                 startstop_nfs restart
113                 startstop_nfslock restart
114                 exit 1
115         }
116
117         # mount needs special handling since it is sometimes not started
118         # correctly on RHEL5
119         if ctdb_check_rpc "MOUNTD" 100005 1 >/dev/null ; then
120                 (service_name="nfs_mountd"; ctdb_counter_init)
121         else
122         (
123                 service_name="nfs_mountd"
124                 ctdb_counter_incr
125
126                 ctdb_check_counter_equal 5 || {
127                         p="rpc.mountd"
128                         cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
129                         echo "Trying to restart MOUNTD [${cmd}]"
130                         killall -q -9 $p
131                         $cmd &
132                         exit 0
133                 }
134
135                 ctdb_check_counter_limit 10 quiet >/dev/null
136         ) || {
137                 echo "$ctdb_check_rpc_out"
138                 p="rpc.mountd"
139                 cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
140                 echo "Trying to restart MOUNTD [${cmd}]"
141                 killall -q -9 $p
142                 $cmd &
143                 exit 1
144         }
145         fi
146
147
148         # rquotad needs special handling since it is sometimes not started
149         # correctly on RHEL5
150         # this is not a critical service so we dont flag the node as unhealthy
151         ctdb_check_rpc "RQUOTAD" 100011 1 || {
152                 p="rpc.rquotad"
153                 cmd="${p}${RQUOTAD_PORT:+ -p }${RQUOTAD_PORT}"
154                 echo "Trying to restart RQUOTAD [${cmd}]"
155                 killall -q -9 $p
156                 $cmd &
157         }
158
159         # once every 60 seconds, update the statd state database for which
160         # clients need notifications
161         LAST_UPDATE=`stat --printf="%Y" $CTDB_VARDIR/state/statd/update-trigger 2>/dev/null`
162         CURRENT_TIME=`date +"%s"`
163         [ $CURRENT_TIME -ge $(($LAST_UPDATE + 60)) ] && {
164             mkdir -p $CTDB_VARDIR/state/statd
165             touch $CTDB_VARDIR/state/statd/update-trigger
166             $CTDB_BASE/statd-callout updatelocal &
167             $CTDB_BASE/statd-callout updateremote &
168         }
169         ;;
170
171     ipreallocated)
172         # if the ips have been reallocated, we must restart the lockmanager
173         # across all nodes and ping all statd listeners
174         [ -x $CTDB_BASE/statd-callout ] && {
175                 $CTDB_BASE/statd-callout notify &
176         } >/dev/null 2>&1
177         ;;
178     *)
179         ctdb_standard_event_handler "$@"
180         ;;
181 esac
182
183 exit 0