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(a)virtuozzo.com>
---
src/vz/vz_sdk.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index c6408e9..563e47a 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -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;
}
--
2.4.3