------------------------------------------------------------ revno: 410 revision-id: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> branch nick: tridge timestamp: Fri 2007-06-01 13:29:11 +1000 message: merged from ronnie modified: tools/events events-20070529030121-04fjh63cxfh8v1pj-1 tools/statd-callout statdcallout-20070531010857-6sdlz455vusye5y5-1 ------------------------------------------------------------ revno: 393.1.3 merged: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Ronnie Sahlberg <[EMAIL PROTECTED]> branch nick: ctdb timestamp: Fri 2007-06-01 13:26:14 +1000 message: it is -f not -x to check if a file exists ------------------------------------------------------------ revno: 393.1.2 merged: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Ronnie Sahlberg <[EMAIL PROTECTED]> branch nick: ctdb timestamp: Fri 2007-06-01 13:14:05 +1000 message: - create /etc/ctdb/taken_ips and /etc/ctdb/changed_ips analog to the existing /etc/ctdb/released_ips - only call the statd-callout script if the ips have changed and call it with a "notify" argument. we need to restart nfslock service in both cases - change statd-callout to explicitely restart the lock manager and statd when "notify" is called. copy the state directory for each held ip from shared storage to /tmp then use sm-notify to send notifications to all monitored clients ------------------------------------------------------------ revno: 393.1.1 merged: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Ronnie Sahlberg <[EMAIL PROTECTED]> branch nick: ctdb timestamp: Fri 2007-06-01 13:03:53 +1000 message: new branch from tridges tree === modified file 'tools/events' --- a/tools/events 2007-05-31 01:09:45 +0000 +++ b/tools/events 2007-06-01 03:26:14 +0000 @@ -41,6 +41,9 @@ echo "Failed to add $ip/$maskbits on dev $iface" exit 1 } + echo $ip >> /etc/ctdb/taken_ips + echo $ip >> /etc/ctdb/changed_ips + # if we have a local arp entry for this IP then remove it /sbin/arp -d $ip 2> /dev/null @@ -65,19 +68,27 @@ # if we have a local arp entry for this IP then remove it /sbin/arp -d $ip 2> /dev/null echo $ip >> /etc/ctdb/released_ips + echo $ip >> /etc/ctdb/changed_ips /bin/rm -f /etc/ctdb/ip.$ip exit 0 ;; recovered) - # restart any services as necessary, like NFS - # - [ -x /etc/ctdb/statd-callout ] && /etc/ctdb/statd-callout copy + # if we have taken or released any ips we must send out + # statd notifications to recover lost nfs locks + [ -x /etc/ctdb/statd-callout ] && [ -f /etc/ctdb/changed_ips ] && { + /etc/ctdb/statd-callout notify & + } >/dev/null 2>&1 + + # restart NFS to ensure that all TCP connections to the released ip + # are closed [ -f /etc/ctdb/released_ips ] && { ( /sbin/service nfs status > /dev/null 2>&1 && /sbin/service nfs restart > /dev/null 2>&1 ) & } > /dev/null 2>&1 + /bin/rm -f /etc/ctdb/changed_ips /bin/rm -f /etc/ctdb/released_ips + /bin/rm -f /etc/ctdb/taken_ips exit 0 ;;
=== modified file 'tools/statd-callout' --- a/tools/statd-callout 2007-05-31 01:14:07 +0000 +++ b/tools/statd-callout 2007-06-01 03:14:05 +0000 @@ -22,23 +22,23 @@ /bin/rm -f $STATD_SHARED_DIRECTORY/$ip/$2 done ;; - copy) - restart_needed=0 + notify) + # restart the local lock manager and statd + /sbin/service nfslock stop > /dev/null 2>&1 + /sbin/service nfslock start > /dev/null 2>&1 + # send out notifications to any additional ips we now serve for f in `/bin/ls /etc/ctdb/ip.*`; do fname=`/bin/basename $f` ip=`echo $fname | cut -d. -f2-` [ -d $STATD_SHARED_DIRECTORY/$ip ] && { - /bin/mv $STATD_SHARED_DIRECTORY/$ip $STATD_SHARED_DIRECTORY/$ip.$$ - /bin/cp -a $STATD_SHARED_DIRECTORY/$ip.$$/. /var/lib/nfs/statd/sm/ - /bin/rm -rf $STATD_SHARED_DIRECTORY/$ip.$$ - restart_needed=1 + # we must copy to a different directory since rpc.statd gets + # "upset" if sm-notify touches the files. + /bin/rm -rf /tmp/statd/$ip + /bin/mkdir -p /tmp/statd/$ip + /bin/cp -apr $STATD_SHARED_DIRECTORY/$ip/* /tmp/statd/$ip + /usr/sbin/sm-notify -P /tmp/statd/$ip -v $ip -n } done - # restart lockd if necessary - [ $restart_needed -eq 1 ] && { - ( /sbin/service nfslock status > /dev/null 2>&1 && - /sbin/service nfslock restart > /dev/null 2>&1 ) & - } > /dev/null 2>&1 ;; esac