[libvirt] [PATCH] qemu: conf: Work around race condition on libvirt start
Daniel P. Berrange
berrange at redhat.com
Mon Dec 9 10:56:02 UTC 2013
On Sat, Dec 07, 2013 at 02:03:00AM -0500, Adam Walters wrote:
> This patch works around a race condition present during
> libvirt startup. The race condition only applies when
> using storage pool volumes for domain disks, and even
> then, only when restarting libvirt with running domains.
>
> The gist of the patch is simply to enter a (limited)
> retry loop during qemuTranslateDiskSourcePool. This
> particular implementation does have a slight drawback,
> though. Within that function, I can not determine if
> we are currently starting libvirt, or if we are just
> starting up a domain. In the latter case, this could
> cause a 800ms delay in reporting an error that the
> storage pool is inactive.
>
> I am happy to report, however, that with this patch,
> domains continue to run without restarts regardless
> of how often I restart libvirt. I have a fairly fast
> hypervisor, and have never seen it try more than one
> iteration of the retry loop unless I purposely set
> one of the storage pools to be inactive.
> ---
> src/qemu/qemu_conf.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index c28908a..2e52fbf 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1359,6 +1359,8 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
> virStorageVolInfo info;
> int ret = -1;
> virErrorPtr savedError = NULL;
> + int attempt = 0;
> + int poolAutostart;
>
> if (def->type != VIR_DOMAIN_DISK_TYPE_VOLUME)
> return 0;
> @@ -1369,7 +1371,16 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
> if (!(pool = virStoragePoolLookupByName(conn, def->srcpool->pool)))
> return -1;
>
> +retry:
> if (virStoragePoolIsActive(pool) != 1) {
> + if (!(virStoragePoolGetAutostart(pool, &poolAutostart) < 0))
> + if (poolAutostart && attempt < 4) {
> + VIR_DEBUG("Waiting for storage pool '%s' to activate",
> + def->srcpool->pool);
> + usleep(200*1000); /* sleep 200ms */
> + attempt++;
> + goto retry;
> + }
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> _("storage pool '%s' containing volume '%s' "
> "is not active"),
This is rather dubious and points toa bug elsewhere. The storage driver
should complete its autostart before the QEMU driver even starts its
own initialization.
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