vz: fix possible vzDomainDefineXMLFlags and prlsdkNewDomainByHandle race

Lock driver when a new domain is created in prlsdkNewDomainByHandle
and try to find it in the list under lock again because it can race
with vzDomainDefineXMLFlags when a domain with the same uuid is added
via vz dispatcher directly and libvirt define.

Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com>
This commit is contained in:
Maxim Nestratov 2016-04-12 20:30:57 +03:00
parent 7762c5a233
commit eb5e9c1ea9

View File

@ -1254,9 +1254,18 @@ prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom)
unsigned char uuid[VIR_UUID_BUFLEN];
char *name = NULL;
virObjectLock(driver);
if (prlsdkGetDomainIds(sdkdom, &name, uuid) < 0)
goto cleanup;
/* we should make sure that there is no such a VM exists */
dom = virDomainObjListFindByUUID(driver->domains, uuid);
if (dom) {
virObjectUnlock(dom);
dom = NULL;
goto cleanup;
}
if (!(dom = vzNewDomain(driver, name, uuid)))
goto cleanup;
@ -1267,6 +1276,7 @@ prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom)
}
cleanup:
virObjectUnlock(driver);
VIR_FREE(name);
return dom;
}