allow net ads join accept new osServicePack parameter
[Samba.git] / ctdb / config / events.d / 60.ganesha
blob150be1f15942f33bd070a6788dd8331ed05b7a25
1 #!/bin/sh
2 # script to manage nfs in a clustered environment
4 [ -n "$CTDB_BASE" ] || \
5 export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD")
7 . $CTDB_BASE/functions
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"
15 service_start ()
17 startstop_ganesha stop
18 startstop_ganesha start
19 set_proc "sys/net/ipv4/tcp_tw_recycle" 1
22 service_stop ()
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 &
33 } >/dev/null 2>&1
36 loadconfig "nfs"
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 nodenum_file="${service_state_dir}/gpfs_nodenum"
55 get_cluster_fs_state ()
57 case $CTDB_CLUSTER_FILESYSTEM_TYPE in
58 gpfs)
59 STATE=`$GPFS_STATE | awk 'NR <= 3 {next} {printf "%-6s", $3}'`
60 echo $STATE
63 die "File system $CTDB_CLUSTER_FILESYSTEM_TYPE not supported"
65 esac
68 create_nodenum_file()
70 NNUM=$(/usr/lpp/mmfs/bin/mmlsconfig myNodeConfigNumber | awk '{print $2}')
71 echo $NNUM > $nodenum_file
74 get_nodenum()
76 if [ ! -f $nodenum_file ]; then
77 create_nodenum_file
79 cat $nodenum_file
83 create_ganesha_recdirs ()
85 [ -n "$CTDB_GANESHA_REC_SUBDIR" ] || CTDB_GANESHA_REC_SUBDIR=".ganesha"
87 _mounts=$(mount -t $CTDB_CLUSTER_FILESYSTEM_TYPE)
88 if [ -z "$_mounts" ]; then
89 echo "startup $CTDB_CLUSTER_FILESYSTEM_TYPE not ready"
90 exit 0
92 _mntpt=$(echo "$_mounts" | sort | awk 'NR == 1 {print $3}')
93 _link_dst="${_mntpt}/${CTDB_GANESHA_REC_SUBDIR}"
94 mkdir -vp "$_link_dst"
95 if [ -e "$GANRECDIR" ]; then
96 if [ ! -L "$GANRECDIR" ] ; then
97 rm -vrf "$GANRECDIR"
98 else
99 _t=$(readlink "$GANRECDIR")
100 if [ "$_t" != "$_link_dst" ] ; then
101 rm -v "$GANRECDIR"
105 # This is not an "else". It also re-creates the link if it was
106 # removed above!
107 if [ ! -e "$GANRECDIR" ]; then
108 ln -sv "$_link_dst" "$GANRECDIR"
111 mkdir -p $GANRECDIR2
112 mkdir -p $GANRECDIR3
115 monitor_ganesha_nfsd ()
117 create_ganesha_recdirs
118 service_name=${service_name}_process
120 PIDFILE="/var/run/ganesha.pid"
121 CUR_STATE=`get_cluster_fs_state`
122 GANESHA="/usr/bin/$CTDB_CLUSTER_FILESYSTEM_TYPE.ganesha.nfsd"
123 if { read PID < $PIDFILE && \
124 grep "$GANESHA" "/proc/$PID/cmdline" ; } >/dev/null 2>&1 ; then
125 ctdb_counter_init "$service_name"
126 else
127 if [ $CUR_STATE = "active" ]; then
128 echo "Trying fast restart of NFS service"
129 startstop_ganesha restart
130 ctdb_counter_incr "$service_name"
131 ctdb_check_counter "error" "-ge" "6" "$service_name"
135 service_name="nfs-ganesha-$CTDB_CLUSTER_FILESYSTEM_TYPE"_service
136 # check that NFS is posting forward progress
137 if [ $CUR_STATE = "active" -a "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" != "yes" ] ; then
138 MAXREDS=2
139 MAXSTALL=120
140 RESTART=0
142 NUMREDS=`ls $GANRECDIR3 | grep "red" | wc -l`
143 LASTONE=`ls -t $GANRECDIR3 | sed 's/_/ /' | awk 'NR > 1 {next} {printf $1} '`
144 # Beware of startup
145 if [ -z $LASTONE ] ; then
146 LASTONE=`date +"%s"`
148 TNOW=$(date +"%s")
149 TSTALL=$(($TNOW - $LASTONE))
150 if [ $NUMREDS -ge $MAXREDS ] ; then
151 echo restarting because of $NUMREDS red conditions
152 RESTART=1
153 ctdb_counter_incr "$service_name"
154 ctdb_check_counter "error" "-ge" "6" "$service_name"
156 if [ $TSTALL -ge $MAXSTALL ] ; then
157 echo restarting because of $TSTALL second stall
158 RESTART=1
159 ctdb_counter_incr "$service_name"
160 ctdb_check_counter "error" "-ge" "6" "$service_name"
162 if [ $RESTART -gt 0 ] ; then
163 startstop_ganesha restart
164 else
165 ctdb_counter_init "$service_name"
170 ############################################################
172 case "$1" in
173 init)
174 # read statd from persistent database
176 startup)
177 create_ganesha_recdirs
178 ctdb_service_start
179 create_nodenum_file
182 shutdown)
183 ctdb_service_stop
186 takeip)
187 if [ -n "$2" ] ; then
188 case $CTDB_CLUSTER_FILESYSTEM_TYPE in
189 gpfs)
190 NNUM=$(get_nodenum)
191 TDATE=`date +"%s"`
192 TOUCHTGT=$1"_"$TDATE"_"$NNUM"_"$3"_"$4"_"$2
193 touch $GANRECDIR2/$TOUCHTGT
195 esac
197 ctdb_service_set_reconfigure
200 releaseip)
201 if [ -n "$2" ] ; then
202 case $CTDB_CLUSTER_FILESYSTEM_TYPE in
203 gpfs)
204 NNUM=$(get_nodenum)
205 TDATE=`date +"%s"`
206 TOUCHTGT=$1"_"$TDATE"_"$NNUM"_"$3"_"$4"_"$2
207 touch $GANRECDIR2/$TOUCHTGT
208 TOUCHTGT="my"$TOUCHTGT
209 touch $GANRECDIR2/$TOUCHTGT
211 esac
213 ctdb_service_set_reconfigure
216 monitor)
217 # Check that directories for shares actually exist.
218 [ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
219 grep Path /etc/ganesha/$CTDB_CLUSTER_FILESYSTEM_TYPE.ganesha.exports.conf |
220 cut -f2 -d\" | sort -u | ctdb_check_directories
221 } || exit $?
223 update_tickles 2049
225 # check that statd responds to rpc requests
226 # if statd is not running we try to restart it
227 # we only do this IF we have a rpc.statd command.
228 # For platforms where rpc.statd does not exist, we skip
229 # the check completely
230 p="rpc.statd"
231 which $p >/dev/null 2>/dev/null && \
232 nfs_check_rpc_service "statd" \
233 % 10 "verbose restart:b unhealthy" \
234 -ge 6 "verbose unhealthy" \
235 -eq 4 "verbose restart" \
236 -eq 2 "restart:b"
238 if [ "$CTDB_SKIP_GANESHA_NFSD_CHECK" != "yes" ] ; then
239 monitor_ganesha_nfsd
242 # rquotad is sometimes not started correctly on RHEL5
243 # not a critical service so we dont flag the node as unhealthy
244 nfs_check_rpc_service "rquotad" \
245 -gt 0 "verbose restart:b"
249 ctdb_standard_event_handler "$@"
251 esac
253 exit 0