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"), -- 1.8.4.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list