diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3309f346429bb3655373dbff37829a1446352e5d..3279a99f4b01e023a50e2e62f91b0208176a2c09 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -590,6 +590,20 @@ qemuDomainNetsRestart(void *payload, virDomainObjUnlock(vm); } + +static void +qemuDomainFindMaxID(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *data) +{ + virDomainObjPtr vm = payload; + int *driver_maxid = data; + + if (vm->def->id >= *driver_maxid) + *driver_maxid = vm->def->id + 1; +} + + /** * qemudStartup: * @@ -863,6 +877,13 @@ qemudStartup(int privileged) { NULL, NULL) < 0) goto error; + /* find the maximum ID from active and transient configs to initialize + * the driver with. This is to avoid race between autostart and reconnect + * threads */ + virHashForEach(qemu_driver->domains.objs, + qemuDomainFindMaxID, + &qemu_driver->nextvmid); + virHashForEach(qemu_driver->domains.objs, qemuDomainNetsRestart, NULL); conn = virConnectOpen(qemu_driver->uri); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d8cf4c31ac4c98267dbf0d3781da3cf342ba52ff..8bf80e7dbef8dee0fd21a212fa91bcb2113429b5 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3230,9 +3230,6 @@ qemuProcessReconnect(void *opaque) goto error; } - if (obj->def->id >= driver->nextvmid) - driver->nextvmid = obj->def->id + 1; - endjob: if (!qemuDomainObjEndJob(driver, obj)) obj = NULL;