dont restart the tcp service after a ip takeover, it is more efficient
[metze/ctdb/wip.git] / config / events.d / 60.nfs
1 #!/bin/sh
2 # script to manage nfs in a clustered environment
3
4 . /etc/ctdb/functions
5 loadconfig nfs
6
7 [ "$CTDB_MANAGES_NFS" = "yes" ] || exit 0
8 [ -z "$STATD_SHARED_DIRECTORY" ] && exit 0
9
10 cmd="$1"
11 shift
12
13 PATH=/usr/bin:/bin:/usr/sbin:/sbin:$PATH
14
15 case $cmd in 
16      startup)
17         mkdir -p /etc/ctdb/state/nfs
18         /bin/mkdir -p /etc/ctdb/state/statd/ip
19         ctdb_wait_directories "nfslock" "$STATD_SHARED_DIRECTORY"
20
21
22         # wait for all nfs exported directories to become available
23         nfs_dirs=`grep -v '^#' < /etc/exports | cut -d' ' -f1`
24         ctdb_wait_directories "NFS" $nfs_dirs
25
26         # make sure nfs is stopped before we start it, or it may get a bind error
27         service nfs stop > /dev/null 2>&1
28         service nfslock stop > /dev/null 2>&1
29
30         service nfslock start
31         service nfs start
32         ;;
33
34      shutdown)
35         service nfs stop
36         service nfslock stop
37         exit 0
38         ;;
39
40      takeip)
41         ip=$2
42
43         echo $ip >> /etc/ctdb/state/statd/restart
44
45         # having a list of what IPs we have allows statd to do the right 
46         # thing via /etc/ctdb/statd-callout
47         /bin/touch /etc/ctdb/state/statd/ip/$ip
48         exit 0
49         ;;
50
51      releaseip)
52         iface=$1
53         ip=$2
54         maskbits=$3
55
56         echo $ip >> /etc/ctdb/state/nfs/restart
57
58         echo $ip >> /etc/ctdb/state/statd/restart
59         /bin/rm -f /etc/ctdb/state/statd/ip/$ip
60         exit 0
61         ;;
62
63      recovered)
64         # RST all tcp connections used for NFS to ensure that they do
65         # not survive in ESTABLISHED state across a failover/failback
66         # and create an ack storm
67         [ -f /etc/ctdb/state/nfs/restart ] && {
68                 netstat -tn |egrep '^tcp.*\s+[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:2049\s+.*ESTABLISHED' | awk '{print $4" "$5}' | while read dest src; do
69                         srcip=`echo $src | cut -d: -f1`
70                         srcport=`echo $src | cut -d: -f2`
71                         destip=`echo $dest | cut -d: -f1`
72                         destport=`echo $dest | cut -d: -f2`
73                         ctdb killtcp $srcip:$srcport $destip:$destport
74                         ctdb killtcp $destip:$destport $srcip:$srcport 
75                 done
76         } > /dev/null 2>&1
77         /bin/rm -f /etc/ctdb/state/nfs/restart
78
79         # if we have taken or released any ips we must send out
80         # statd notifications to recover lost nfs locks
81         [ -x /etc/ctdb/statd-callout ] && [ -f /etc/ctdb/state/statd/restart ] && {
82                 /etc/ctdb/statd-callout notify &
83         } >/dev/null 2>&1
84
85         /bin/rm -f /etc/ctdb/state/statd/restart
86         ;;
87
88       monitor)
89         # check that NFS responds to rpc requests
90         ctdb_check_rpc "NFS" 100003 3
91         ctdb_check_rpc "mount" 100005 1
92
93         # and that its directories are available
94         nfs_dirs=`grep -v '^#' < /etc/exports | cut -d' ' -f1`
95         ctdb_check_directories "nfs" $nfs_dirs
96
97         # check that lockd responds to rpc requests
98         ctdb_check_rpc "statd" 100024 1
99         ctdb_check_rpc "lockd" 100021 1
100         ctdb_check_directories "statd" $STATD_SHARED_DIRECTORY
101         ;;
102
103 esac
104
105 exit 0