added hooks to make nfs statd behave correctly on failover
authorAndrew Tridgell <tridge@samba.org>
Thu, 31 May 2007 01:09:45 +0000 (11:09 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 31 May 2007 01:09:45 +0000 (11:09 +1000)
.bzrignore
README [deleted file]
packaging/RHEL/ctdb.spec
packaging/RHEL/setup/ctdb.sysconfig
packaging/RHEL/setup/statd-callout [new file with mode: 0755]
tools/events

index 1f939f8271ba5ef1c4b0b008c337b76719d3d320..3b41315a2bd0c1e3e27d3efd43edb6e2799152f2 100644 (file)
@@ -15,3 +15,4 @@ ctdb-1
 ctdb-2
 ctdb-3
 nodes.txt
+TAGS
diff --git a/README b/README
deleted file mode 100644 (file)
index 094d1d9..0000000
--- a/README
+++ /dev/null
@@ -1,3 +0,0 @@
-To build this you need a recent copy of talloc, libreplace and tdb in
-the directory above this directory.
-
index 9bba5683b15a192ef8a178b07dacdfed7a740e12..65d4756065724abb133cee1fc5db71de9732a7db 100644 (file)
@@ -66,6 +66,7 @@ make DESTDIR=$RPM_BUILD_ROOT install
 install -m644 setup/ctdb.sysconfig $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/ctdb
 install -m755 setup/ctdb.init $RPM_BUILD_ROOT%{initdir}/ctdb
 install -m755 tools/events $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/events
+install -m755 tools/statd-callout $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/statd-callout
 install -m755 tools/onnode.ssh $RPM_BUILD_ROOT%{_bindir}
 install -m755 tools/onnode.rsh $RPM_BUILD_ROOT%{_bindir}
 ln -sf %{_bindir}/onnode.ssh $RPM_BUILD_ROOT%{_bindir}/onnode
@@ -107,6 +108,7 @@ fi
 %attr(755,root,root) %config %{initdir}/ctdb
 
 %{_sysconfdir}/ctdb/events
+%{_sysconfdir}/ctdb/statd-callout
 %{_sbindir}/ctdbd
 %{_bindir}/ctdb
 %{_bindir}/onnode.ssh
@@ -114,4 +116,3 @@ fi
 %{_bindir}/onnode
 %{_includedir}/ctdb.h
 %{_includedir}/ctdb_private.h
-
index 13d83ce1abfff56fa47610201936ccea539ea955..f6d13142d3ba21c39af50065174254ee301e8f47 100644 (file)
 # the default is not to wait for any local services
 # CTDB_WAIT_TCP_PORTS="445 139"
 
+# the shared directory where you want to put statd information on
+# which clients to notify on a NFS restart
+# there is no default
+# STATD_SHARED_DIRECTORY="/some/shared/directory"
+
 # any other options you might want. Run ctdbd --help for a list
 # CTDB_OPTIONS=
 
diff --git a/packaging/RHEL/setup/statd-callout b/packaging/RHEL/setup/statd-callout
new file mode 100755 (executable)
index 0000000..5d2959a
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+. /etc/sysconfig/ctdb
+
+[ -z "$STATD_SHARED_DIRECTORY" ] && exit 0
+
+[ -d $STATD_SHARED_DIRECTORY ] || exit 0
+
+case "$1" in
+  add-client)
+        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/mkdir $STATD_SHARED_DIRECTORY/$ip
+           /bin/touch $STATD_SHARED_DIRECTORY/$ip/$2
+       done
+       ;;
+  del-client)
+        for f in `/bin/ls /etc/ctdb/ip.*`; do
+           fname=`/bin/basename $f`
+           ip=`echo $fname | cut -d. -f2-`
+           /bin/rm -f $STATD_SHARED_DIRECTORY/$ip/$2
+       done
+       ;;
+  copy)
+       restart_needed=0
+        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
+           }
+       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
+
index 18d6fc9b2f3221433ba5de99a6d1831ede678a1c..f2508eafe74a86edc32b636752de49886ba0faa8 100755 (executable)
@@ -43,6 +43,10 @@ case $cmd in
        }
        # if we have a local arp entry for this IP then remove it
        /sbin/arp -d $ip 2> /dev/null
+
+       # having a list of what IPs we have allows statd to do the right 
+       # thing via /etc/ctdb/statd-callout
+       /bin/touch /etc/ctdb/ip.$ip
        exit 0
        ;;
 
@@ -61,12 +65,14 @@ case $cmd in
        # 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
+       /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
        [ -f /etc/ctdb/released_ips ] && {
                ( /sbin/service nfs status > /dev/null 2>&1 && 
                       /sbin/service nfs restart > /dev/null 2>&1 ) &