summaryrefslogtreecommitdiff
path: root/ctdb/config/events.d/60.ganesha
blob: 2524fd472fb391dac56e28ff5405626d289713c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#!/bin/sh
# script to manage nfs in a clustered environment

[ -n "$CTDB_BASE" ] || \
    export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD")

. $CTDB_BASE/functions

GANRECDIR="/var/lib/nfs/ganesha"
GANRECDIR2="/var/lib/nfs/ganesha/recevents"
GPFS_STATE="/usr/lpp/mmfs/bin/mmgetstate"
GANRECDIR3="/var/lib/nfs/ganesha_local"


service_start ()
{
    startstop_ganesha stop
    startstop_ganesha start
    set_proc "sys/net/ipv4/tcp_tw_recycle" 1
}

service_stop ()
{
    startstop_ganesha stop
}

service_reconfigure ()
{
    # Restart lock manager, notify clients
    if [ -x "${CTDB_BASE}/statd-callout" ] ; then
	"${CTDB_BASE}/statd-callout" notify &
    fi >/dev/null 2>&1
}

loadconfig "nfs"


[ -n "$CTDB_CLUSTER_FILESYSTEM_TYPE" ] || CTDB_CLUSTER_FILESYSTEM_TYPE="gpfs"

service_name="nfs-ganesha-$CTDB_CLUSTER_FILESYSTEM_TYPE"

[ "${CTDB_NFS_SERVER_MODE:-${NFS_SERVER_MODE}}" = "ganesha" ] || exit 0

ctdb_setup_service_state_dir

ctdb_start_stop_service

is_ctdb_managed_service || exit 0

ctdb_service_check_reconfigure

nodenum_file="${service_state_dir}/gpfs_nodenum"

get_cluster_fs_state  ()
{
    case $CTDB_CLUSTER_FILESYSTEM_TYPE in
        gpfs)
            STATE=`$GPFS_STATE | awk 'NR <= 3 {next} {printf "%-6s", $3}'`
            echo $STATE
            ;;
        *)
            die "File system $CTDB_CLUSTER_FILESYSTEM_TYPE not supported"
            ;;
   esac
}

create_nodenum_file()
{
    NNUM=$(/usr/lpp/mmfs/bin/mmlsconfig myNodeConfigNumber | awk '{print $2}')
    echo $NNUM > $nodenum_file
}

get_nodenum()
{
    if [ ! -f $nodenum_file ]; then
        create_nodenum_file
    fi
    cat $nodenum_file
}


create_ganesha_recdirs ()
{
    [ -n "$CTDB_GANESHA_REC_SUBDIR" ] || CTDB_GANESHA_REC_SUBDIR=".ganesha"

    _mounts=$(mount -t $CTDB_CLUSTER_FILESYSTEM_TYPE)
    if [ -z "$_mounts" ]; then
      echo "startup $CTDB_CLUSTER_FILESYSTEM_TYPE not ready"
      exit 0
    fi
    _mntpt=$(echo "$_mounts" | sort | awk 'NR == 1 {print $3}')
    _link_dst="${_mntpt}/${CTDB_GANESHA_REC_SUBDIR}"
    mkdir -vp "$_link_dst"
    if [ -e "$GANRECDIR" ]; then
        if [ ! -L "$GANRECDIR" ] ; then
            rm -vrf "$GANRECDIR"
	else
	    _t=$(readlink "$GANRECDIR")
	    if [ "$_t" != "$_link_dst" ] ; then
		rm -v "$GANRECDIR"
	    fi
        fi
    fi
    # This is not an "else".  It also re-creates the link if it was
    # removed above!
    if [ ! -e "$GANRECDIR" ]; then
        ln -sv "$_link_dst" "$GANRECDIR"
    fi

    mkdir -p $GANRECDIR2
    mkdir -p $GANRECDIR3
}

monitor_ganesha_nfsd ()
{
	create_ganesha_recdirs
	service_name=${service_name}_process

	PIDFILE="/var/run/ganesha.pid"
	CUR_STATE=`get_cluster_fs_state`
	GANESHA="/usr/bin/$CTDB_CLUSTER_FILESYSTEM_TYPE.ganesha.nfsd"
	if { read PID < $PIDFILE && \
	    grep "$GANESHA" "/proc/$PID/cmdline" ; } >/dev/null 2>&1 ; then
		ctdb_counter_init "$service_name"
	else
	    if [ $CUR_STATE = "active" ]; then
		echo "Trying fast restart of NFS service"
		startstop_ganesha restart
		ctdb_counter_incr "$service_name"
		ctdb_check_counter "error" "-ge" "6" "$service_name"
	    fi
	fi

	service_name="nfs-ganesha-$CTDB_CLUSTER_FILESYSTEM_TYPE"_service
	# check that NFS is posting forward progress
	if [ $CUR_STATE = "active" -a "$CTDB_NFS_SKIP_KNFSD_ALIVE_CHECK" != "yes" ] ; then
	    MAXREDS=2
	    MAXSTALL=120
	    RESTART=0

	    NUMREDS=`ls $GANRECDIR3 | grep "red" | wc -l`
	    LASTONE=`ls -t $GANRECDIR3 | sed 's/_/ /' | awk 'NR > 1 {next} {printf $1} '`
	    # Beware of startup
	    if [ -z $LASTONE ] ; then
		LASTONE=`date +"%s"`
	    fi
	    TNOW=$(date +"%s")
	    TSTALL=$(($TNOW - $LASTONE))
	    if [ $NUMREDS -ge $MAXREDS ] ; then
		echo restarting because of $NUMREDS red conditions
		RESTART=1
		ctdb_counter_incr "$service_name"
		ctdb_check_counter "error" "-ge" "6" "$service_name"
	    fi
	    if [ $TSTALL -ge $MAXSTALL ] ; then
		echo restarting because of $TSTALL second stall
		RESTART=1
		ctdb_counter_incr "$service_name"
		ctdb_check_counter "error" "-ge" "6" "$service_name"
	    fi
	    if [ $RESTART -gt 0 ] ; then
		startstop_ganesha restart
	    else
		ctdb_counter_init "$service_name"
	    fi
	fi
}

############################################################

case "$1" in
     init)
	# read statd from persistent database
	;;
     startup)
	create_ganesha_recdirs
	ctdb_service_start
	create_nodenum_file
	;;

     shutdown)
	ctdb_service_stop
	;;

     takeip)
	if [ -n "$2" ] ; then
	    case  $CTDB_CLUSTER_FILESYSTEM_TYPE in
		gpfs)
		    NNUM=$(get_nodenum)
		    TDATE=`date +"%s"`
		    TOUCHTGT=$1"_"$TDATE"_"$NNUM"_"$3"_"$4"_"$2
		    touch $GANRECDIR2/$TOUCHTGT
		    ;;
	    esac
	fi
	ctdb_service_set_reconfigure
	;;

     releaseip)
	if [ -n "$2" ] ; then
	    case  $CTDB_CLUSTER_FILESYSTEM_TYPE in
		gpfs)
		    NNUM=$(get_nodenum)
		    TDATE=`date +"%s"`
		    TOUCHTGT=$1"_"$TDATE"_"$NNUM"_"$3"_"$4"_"$2
		    touch $GANRECDIR2/$TOUCHTGT
		    TOUCHTGT="my"$TOUCHTGT
		    touch $GANRECDIR2/$TOUCHTGT
		;;
	    esac
	fi
	ctdb_service_set_reconfigure
	;;

     monitor)
	# Check that directories for shares actually exist.
	[ "$CTDB_NFS_SKIP_SHARE_CHECK" = "yes" ] || {
	    grep Path /etc/ganesha/$CTDB_CLUSTER_FILESYSTEM_TYPE.ganesha.exports.conf |
	    cut -f2 -d\" | sort -u | ctdb_check_directories
	} || exit $?

	update_tickles 2049
	nfs_update_lock_info

	nfs_check_service "status" <<EOF
version="1"  # could drop this and use any version?
restart_every=2
unhealthy_after=6
service_stop_cmd="killall -q -9 rpc.statd"
service_start_cmd="rpc.statd ${STATD_HA_CALLOUT:+-H} $STATD_HA_CALLOUT ${STATD_HOSTNAME:+-n} $STATD_HOSTNAME ${STATD_PORT:+-p} $STATD_PORT ${STATD_OUTGOING_PORT:+-o} $STATD_OUTGOING_PORT"
service_debug_cmd="program_stack_traces rpc.statd 5"
EOF

	if [ "$CTDB_SKIP_GANESHA_NFSD_CHECK" != "yes" ] ; then
	    monitor_ganesha_nfsd
	fi

	# rquotad is sometimes not started correctly on RHEL5
	nfs_check_service "rquotad" <<EOF
version="1"  # could drop this and use any version?
restart_every=2
unhealthy_after=6
service_stop_cmd="killall -q -9 rpc.rquotad"
service_start_cmd="rpc.rquotad ${RQUOTAD_PORT:+-p} $RQUOTAD_PORT"
service_debug_cmd="program_stack_traces rpc.rquotad 5"
EOF
	;;

     *)
	ctdb_standard_event_handler "$@"
        ;;
esac

exit 0