#!/bin/sh # ctdb event script for NFS tickle acks PATH=/bin:/usr/bin:$PATH . $CTDB_BASE/functions loadconfig ctdb loadconfig nfs cmd="$1" shift [ "$CTDB_MANAGES_NFS" = "yes" ] || exit 0 [ -z "$NFS_TICKLE_SHARED_DIRECTORY" ] && exit 0 case $cmd in startup) mkdir -p $CTDB_BASE/state/nfstickle mkdir -p $NFS_TICKLE_SHARED_DIRECTORY/`hostname` # we rely on fast tcp wait1 recycling echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle exit 0 ;; takeip) iface=$1 ip=$2 shopt -s nullglob # first send a grat arp, to ensure the client knows the updated # mac address for this IP ctdb gratiousarp $ip $iface # send tickle acks for all the connections the old server had for f in $NFS_TICKLE_SHARED_DIRECTORY/*/$ip; do cat $f | while read dest; do dip=`echo $dest | cut -d: -f1` dport=`echo $dest | cut -d: -f2` # send three, in case of lost packets echo "Sending NFS tickle ack for $ip to $dip:$dport" for i in `seq 1 3`; do ctdb tickle $dip:$dport $ip:2049 done done done exit 0 ;; releaseip) exit 0 ;; recovered) exit 0 ;; shutdown) exit 0 ;; monitor) mydir=$NFS_TICKLE_SHARED_DIRECTORY/`hostname` rm -f $mydir/* # record our connections to shared storage netstat -tn |egrep '^tcp[[:space:]]+[0-9]+[[:space:]]+[0-9]+[[:space:]]+[0-9\.]+:2049.*ESTABLISHED' | awk '{print $4" "$5}' | while read dest src; do ip=`echo $dest | cut -d: -f1` echo $src >> $mydir/$ip done exit 0 ;; esac # ignore unknown commands exit 0