[libvirt] [PATCH 3/3] Support automatic creation of leases for disks in sanlock
Daniel P. Berrange
berrange at redhat.com
Fri Jun 24 11:36:29 UTC 2011
On Thu, Jun 23, 2011 at 08:36:28AM -0600, Eric Blake wrote:
> On 06/17/2011 06:38 AM, Daniel P. Berrange wrote:
> > To make use of this capability the admin will need todo
> > several tasks:
> >
> > - Mount an NFS volume (or other shared filesystem)
> > on /var/lib/libvirt/sanlock
> > - Configure 'host_id' in /etc/libvirt/qemu-sanlock.conf
> > with a unique value for each host with the same NFS
> > mount
> > - Toggle the 'auto_disk_leases' parameter in qemu-sanlock.conf
>
> And where is this documented, besides the commit message? While the
> code has been ACK'd, we're still lacking the most important piece for
> making this actually useful to sysadmins, since it is not an
> out-of-the-box setup.
>
> > p = virConfGetValue(conf, "require_lease_for_disks");
> > CHECK_TYPE("require_lease_for_disks", VIR_CONF_LONG);
> > if (p)
> > driver->requireLeaseForDisks = p->l;
> > + else
> > + driver->requireLeaseForDisks = driver->autoDiskLease ? false : true;
>
> s/driver->autoDiskLease ? false : true/!driver->autoDiskLease/
>
> > +#
> > +# The default location in which lockspaces are created when
> > +# automatic lease creation is enabled. For each unique disk
> > +# path, a file $LEASE_DIR/NNNNNNNNNNNNNN will be created
> > +# where 'NNNNNNNNNNNN' is the MD5 checkout of the disk path.
>
> Intentional length mismatch? We could probably get by with just the
> shorter NNN, and users should realize that MD5 sums are longer than 3
> hex digits.
>
> > #
> > # Flag to determine whether we allow starting of guests
> > # which do not have any <lease> elements defined in their
> > # configuration.
> > #
> > +# If 'auto_disk_leases' is disabled, this setting defaults
> > +# to enabled, otherwise it defaults to disabled.
> > +#
> > #require_lease_for_disks = 1
>
> Well, that addresses my comment on 2/3.
>
> > +++ b/tools/virt-sanlock-cleanup.cron.in
> > @@ -0,0 +1,4 @@
> > +#!/bin/sh
> > +
> > + at SBINDIR@/virt-sanlock-cleanup -q
> > +exit 0
>
> Do we want to always ignore failure like this? Or can cron reasonably
> act on non-zero $? from virt-sanlock-cleanup?
I don't think there's anything useful it can do.
> > +LOCKSPACE="__LIBVIRT__DISKS__"
> > +
> > +LOCKDIR=`augtool print /files at SYSCONFDIR@/libvirt/qemu-sanlock.conf/disk_lease_dir`
>
> Not that @SYSCONFDIR@ will ever have spaces, but this would be more
> robust as:
>
> LOCKDIR=`augtool print
> '/files at SYSCONFDIR@/libvirt/qemu-sanlock.conf/disk_lease_dir'`
OK
> > +if test $? != 0 -o "x$DIR" = "x" ; then
>
> s/DIR/LOCKDIR/
>
> > + LOCKDIR="@LOCALSTATEDIR@/lib/libvirt/sanlock"
> > +fi
> > +
> > +function notify() {
>
> "function" is a bash-ism, not guaranteed to be in /bin/sh. Just use:
>
> notify() {
>
> (that is, s/function //)
>
> > + if test $verbose = 1 ; then
> > + echo "$@"
>
> echo is unsafe on arbitrary text, if that text starts with - or includes
> \. Instead, you want:
>
> printf %s\\n "$*"
>
> > + fi
> > +}
> > +
> > +cd $LOCKDIR
>
> Check for failure, and use quoting:
>
> cd "$LOCKDIR" || ...
>
> > +
> > +for MD5 in *
>
> This ignores dot-files. Do we need to worry about people naming disk
> images with a leading dot and thus wasting resources?
This directory doesn't contain disk images. It only contains
leases whose names are always an MD5 sum. So there are no
dot-files to worry about.
> > +do
> > + if test $MD5 != '*' -a $MD5 != $LOCKSPACE ; then
>
> 'test ... -a ...' is not portable (didn't 'make syntax-check' call you
> on this? If not, it should have, since we have a syntax check for
> that). Missing quoting:
Yes, I've already fixed that.
>
> if test "$MD5" != '*' && test "$MD5" != $LOCKSPACE; then
>
> > + RESOURCE="$LOCKSPACE:$MD5:$LOCKDIR/$MD5:0"
> > + notify -n "Cleanup: $RESOURCE "
>
> Oh, you want to conditionally suppress trailing newline. Then earlier,
> you need:
>
> notify() {
> test $verbose = 1 || return
> if test "x$1" = "x-n"; then
> shift
> printf %s "$*"
> else
> printf %s\\n "$*"
> fi
> }
OK
>
> > + sanlock client command -r $RESOURCE -c /bin/rm -f "$LOCKDIR/$MD5" 2>/dev/null
> > + if test $? = 0 ; then
> > + notify "PASS"
> > + else
> > + notify "FAIL"
> > + fi
> > + fi
> > +done
> > +
> > +exit 0
>
> ...
>
> > +=head1 EXIT STATUS
> > +
> > +Upon successful cleanup, an exit status of 0 will be set. Upon
> > +failure a non-zero status will be set.
>
> Really? Looks to me like the script blindly succeeds, rather than
> passing on exit status.
Cut+past error. It should always succeed. We actually expect to get
errors for any of the leases which are associated with running VMs,
so don't want to propagate that.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list