Hi, On Tue, Jun 19, 2012 at 3:13 PM, Ulrich Windl <[email protected]> wrote: >>>> Andreas Kurz <[email protected]> schrieb am 19.06.2012 um 10:48 in >>>> Nachricht > <[email protected]>: >> On 06/19/2012 04:00 AM, Martin Marji Cermak wrote: >> > Hello guys, >> > I have 3 questions if you please. >> > >> > I have a HA NFS cluster - Centos 6.2, pacemaker, corosync, two NFS nodes >> > plus 1 quorum node, in semi Active-Active configuration. >> > By "semi", I mean that both NFS nodes are active and each of them is under >> > normal circumstances exclusively responsible for one (out of two) Volume >> > Group - using the ocf:heartbeat:LVM RA. >> > Each LVM volume group lives on a dedicated multipath iscsi device, exported >> > from a shared SAN. >> > >> > I'm exporting a NFSv3/v4 export (/srv/nfs/software_repos directory). I need >> > to make it available for 2 separate /21 networks as read-only, and for 3 >> > different servers as read-write. >> > I'm using the ocf:heartbeat:exportfs RA and it seems to me I have to use >> > the ocf:heartbeat:exportfs RA 5 times. >> >> If you want to use NFSv4 you also need to export the virtual nfs >> file-system root with fsid=0. >> >> In its current incarnation, the exportfs RA does not allow to summarize >> different clients with the same export options in one primitive >> configuration, though the exportfs command would support it ... patches >> are welcome ;-) > > The problem is: What to do if "1 out of n" exports fails: Is the resource > "started" or "stopped" then. Likewise for unexporting and monitoring. > > Actually I have modified the resource to allow multiple hosts, but the > described problem made me wonder what to do. My patch looks like this (based > on SLES 11 SP1 resource-agents-3.9.2-0.4.2.1): > From f6a50995d82971da8a582b8862a5fdf1b1c19eb5 Mon Sep 17 00:00:00 2001 > From: Ulrich Windl <[email protected]> > Date: Thu, 12 Apr 2012 15:42:21 +0200 > Subject: [PATCH] exportfs: allow multiple clients in clientspec > > Changed exportfs to allow a list of space-separated clients for parameter > "clientspec". > > Fixed some obvious problems: > (1) Correctly match entries for long directories in exportfs_monitor(). > > (2) Actually allow a uuid (not just a number) for the "fsid=" option. > > Other changes: > Consistently use "directory" instead of file system" for messages. > Announce when writing an rmtab backup in backup_rmtab(). > --- > exportfs | 86 > ++++++++++++++++++++++++++++++++++++++++++++------------------ > 1 files changed, 61 insertions(+), 25 deletions(-) > > diff --git a/exportfs b/exportfs > index bc8e341..dfe4fe8 100755 > --- a/exportfs > +++ b/exportfs > @@ -46,10 +46,10 @@ Manages NFS exports > <parameter name="clientspec" unique="0" required="1"> > <longdesc lang="en"> > The client specification allowing remote machines to mount the directory > -over NFS. > +over NFS. A list of clients separated by a space is allowed. > </longdesc> > <shortdesc lang="en"> > -Client ACL. > +Client specification > </shortdesc> > <content type="string" /> > </parameter> > @@ -155,6 +155,7 @@ return $OCF_SUCCESS > backup_rmtab() { > local rmtab_backup > if [ ${OCF_RESKEY_rmtab_backup} != "none" ]; then > + ocf_log info "backup_rmtab(): Writing ${rmtab_backup}" > rmtab_backup="${OCF_RESKEY_directory}/${OCF_RESKEY_rmtab_backup}" > grep ":${OCF_RESKEY_directory}:" /var/lib/nfs/rmtab > ${rmtab_backup} > fi > @@ -181,35 +182,60 @@ END > > exportfs_monitor () > { > - # "grep -z" matches across newlines, which is necessary as > - # exportfs output wraps lines for long export directory names > - exportfs | grep -zqs > "${OCF_RESKEY_directory}[[:space:]]*${OCF_RESKEY_clientspec}" > - > -#Adapt grep status code to OCF return code > - case $? in > - 0) > + local nclient=0 nmatch=0 rc client > + for client in $OCF_RESKEY_clientspec > + do > + (( ++nclient )) > + # exportfs uses TAB to continue wrapped entries for long > + # directory names > + #<DIR> > + #<TAB><TAB><HOST> > + # instead of > + #<DIR><SPACE>*<HOST> > + exportfs | grep -qs > "^${OCF_RESKEY_directory}[[:space:]][[:space:]]*${client}\$" || > + exportfs | sed -n -e '\:^'"$OCF_RESKEY_directory"'$:,+1p' | > + grep -qs "[[:space:]][[:space:]]*${client}\$" > + rc=$? > + if [ "$rc" -eq 0 ] > + then > + (( ++nmatch )) > + elif [ "$rc" -ne 1 ] > + then > + ocf_log err "Unable to determine export status for > $client:${OCF_RESKEY_directory}" > + break > + else > + ocf_log info "Directory ${OCF_RESKEY_directory} is not > exported to $client" > + fi > + done > + #Adapt grep status code and match count to OCF return code > + if [ "$rc" -gt 1 ] > + then > + return $OCF_ERR_GENERIC > + elif [ "$nclient" -eq "$nmatch" ] > + then > ocf_log info "Directory ${OCF_RESKEY_directory} is exported > to ${OCF_RESKEY_clientspec} (started)." > # Backup the rmtab to ensure smooth NFS-over-TCP failover > backup_rmtab > return $OCF_SUCCESS > - ;; > - 1) > + elif [ "$nmatch" -eq 0 ] > + then > ocf_log info "Directory ${OCF_RESKEY_directory} is not > exported to ${OCF_RESKEY_clientspec} (stopped)." > - return $OCF_NOT_RUNNING;; > - *) > - ocf_log err "Unable to determine export status for > ${OCF_RESKEY_directory}." > - return $OCF_ERR_GENERIC;; > - esac > + return $OCF_NOT_RUNNING > + else > + ocf_log err "${OCF_RESKEY_directory} is exported to $nmatch > out of $nclient clients" > + return $OCF_ERR_GENERIC > + fi > } > > exportfs_start () > { > + local client > if exportfs_monitor; then > ocf_log debug "${OCF_RESKEY_directory} already exported" > return $OCF_SUCCESS > fi > > - ocf_log info "Exporting file system ..." > + ocf_log info "Exporting directory ${OCF_RESKEY_directory} ..." > > if [ ${OCF_RESKEY_options} ]; then > OPTIONS="${OCF_RESKEY_options}" > @@ -217,37 +243,47 @@ exportfs_start () > fi > if [ `echo ${OPTIONS} | grep fsid` ]; then > #replace fsid provided in options list with one provided in > fsid param. > - OPTIONS=`echo ${OPTIONS} | sed > "s/fsid=[0-9]\+/fsid=${OCF_RESKEY_fsid}/g"` > + OPTIONS=`echo ${OPTIONS} | sed > "s/fsid=[-0-9a-f]\+/fsid=${OCF_RESKEY_fsid}/g"` > else > #tack the fsid option onto our options list. > OPTIONS="${OPTIONS}${OPTPREFIX}fsid=${OCF_RESKEY_fsid}" > fi > OPTIONS="-o ${OPTIONS}" > > - ocf_run exportfs -v ${OPTIONS} > ${OCF_RESKEY_clientspec}:${OCF_RESKEY_directory} || exit $OCF_ERR_GENERIC > + for client in $OCF_RESKEY_clientspec > + do > + ocf_log debug "Exporting $OCF_RESKEY_directory to $client" > + ocf_run exportfs -v ${OPTIONS} $client:${OCF_RESKEY_directory} || > exit $OCF_ERR_GENERIC > + done > > # Restore the rmtab to ensure smooth NFS-over-TCP failover > restore_rmtab > > - ocf_log info "File system exported" > + ocf_log info "Directory ${OCF_RESKEY_directory} exported" > return $OCF_SUCCESS > } > > exportfs_stop () > { > + local client > exportfs_monitor > if [ $? -eq $OCF_NOT_RUNNING ]; then > ocf_log debug "${OCF_RESKEY_directory} not exported" > return $OCF_SUCCESS > fi > > - ocf_log info "Un-exporting file system ..." > + ocf_log info "Un-exporting directory ${OCF_RESKEY_directory} ..." > > # Backup the rmtab to ensure smooth NFS-over-TCP failover > backup_rmtab > > - ocf_run exportfs -v -u > ${OCF_RESKEY_clientspec}:${OCF_RESKEY_directory} > - rc=$? > + for client in $OCF_RESKEY_clientspec > + do > + ocf_log debug "Un-exporting $OCF_RESKEY_directory from $client" > + ocf_run exportfs -v -u $client:${OCF_RESKEY_directory} > + rc=$? > + [ "$rc" -eq 0 ] || break > + done > > if ocf_is_true ${OCF_RESKEY_unlock_on_stop}; then > local unlockfile > @@ -274,11 +310,11 @@ exportfs_stop () > fi > > if [ $rc -eq 0 ]; then > - ocf_log info "Un-exported file system" > + ocf_log info "Un-exported directory ${OCF_RESKEY_directory}" > return $OCF_SUCCESS > fi > > - ocf_log err "Failed to un-export file system" > + ocf_log err "Failed to un-export directory ${OCF_RESKEY_directory}" > exit $OCF_ERR_GENERIC > } > > -- > 1.6.0.2 > > Note that the description of the "clientspec" parameter was so vague that I > didn't even had to change the description. Sorry that I added some unrelated > fixes also. Fix "(1)" could be improved most likely.
I've applied the patch on the Debian Squeeze exportfs RA (1:3.9.2-5~bpo60+1) and it fails due to the (( ++nclient )) construct, which dash, the symlink /bin/sh points to, is unaware of. If I use it with bash, it works fine. Thanks for the patch. Regards, Dan > > [...] > > Regards, > Ulrich > > _______________________________________________ > Linux-HA mailing list > [email protected] > http://lists.linux-ha.org/mailman/listinfo/linux-ha > See also: http://linux-ha.org/ReportingProblems -- Dan Frincu CCNA, RHCE _______________________________________________ Linux-HA mailing list [email protected] http://lists.linux-ha.org/mailman/listinfo/linux-ha See also: http://linux-ha.org/ReportingProblems
