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

Reply via email to