87955df92ccd4595210943f734d83a1f0afe657c
[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         if ctdb_check_rpc "LOCKD" 100021 1 >/dev/null ; then
111                 (service_name="lockd"; ctdb_counter_init)
112         else
113                 (
114                         service_name="lockd"
115                         ctdb_counter_incr
116
117                         ctdb_check_counter_equal 10 || {
118                                 echo "Trying to restart NFS lock service"
119                                 startstop_nfs restart >/dev/null 2>&1 &
120                                 startstop_nfslock restart  >/dev/null 2>&1 &
121                                 exit 0
122                         }
123
124                         ctdb_check_counter_limit 15 quiet >/dev/null
125         ) || {
126                         echo "$ctdb_check_rpc_out"
127                         echo "Trying to restart NFS lock service"
128                         startstop_nfs restart
129                         startstop_nfslock restart
130                         exit 1
131                 }
132         fi
133
134         # mount needs special handling since it is sometimes not started
135         # correctly on RHEL5
136         if ctdb_check_rpc "MOUNTD" 100005 1 >/dev/null ; then
137                 (service_name="nfs_mountd"; ctdb_counter_init)
138         else
139         (
140                 service_name="nfs_mountd"
141                 ctdb_counter_incr
142
143                 ctdb_check_counter_equal 5 || {
144                         p="rpc.mountd"
145                         cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
146                         echo "Trying to restart MOUNTD [${cmd}]"
147                         killall -q -9 $p
148                         $cmd &
149                         exit 0
150                 }
151
152                 ctdb_check_counter_limit 10 quiet >/dev/null
153         ) || {
154                 echo "$ctdb_check_rpc_out"
155                 p="rpc.mountd"
156                 cmd="${p}${MOUNTD_PORT:+ -p }${MOUNTD_PORT}"
157                 echo "Trying to restart MOUNTD [${cmd}]"
158                 killall -q -9 $p
159                 $cmd &
160                 exit 1
161         }
162         fi
163
164
165         # rquotad needs special handling since it is sometimes not started
166         # correctly on RHEL5
167         # this is not a critical service so we dont flag the node as unhealthy
168         ctdb_check_rpc "RQUOTAD" 100011 1 || {
169                 p="rpc.rquotad"
170                 cmd="${p}${RQUOTAD_PORT:+ -p }${RQUOTAD_PORT}"
171                 echo "Trying to restart RQUOTAD [${cmd}]"
172                 killall -q -9 $p
173                 $cmd &
174         }
175
176         # once every 60 seconds, update the statd state database for which
177         # clients need notifications
178         LAST_UPDATE=`stat --printf="%Y" $CTDB_VARDIR/state/statd/update-trigger 2>/dev/null`
179         CURRENT_TIME=`date +"%s"`
180         [ $CURRENT_TIME -ge $(($LAST_UPDATE + 60)) ] && {
181             mkdir -p $CTDB_VARDIR/state/statd
182             touch $CTDB_VARDIR/state/statd/update-trigger
183             $CTDB_BASE/statd-callout updatelocal &
184             $CTDB_BASE/statd-callout updateremote &
185         }
186         ;;
187
188     ipreallocated)
189         # if the ips have been reallocated, we must restart the lockmanager
190         # across all nodes and ping all statd listeners
191         [ -x $CTDB_BASE/statd-callout ] && {
192                 $CTDB_BASE/statd-callout notify &
193         } >/dev/null 2>&1
194         ;;
195     *)
196         ctdb_standard_event_handler "$@"
197         ;;
198 esac
199
200 exit 0