[libvirt] [PATCH] vz: make more accurate closing connection to sdk

Current code for example can call unsubscribe if connection succeeds but subscribing fails. This will probabaly lead only to spurious error messages without any actual inconsistencies but nevertheless. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- NOTE!!! this patch is applied on top of migration series src/vz/vz_driver.c | 9 ++------ src/vz/vz_sdk.c | 65 +++++++++++++++++++++++++++--------------------------- src/vz/vz_sdk.h | 2 -- 3 files changed, 34 insertions(+), 42 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 8264ac0..1e56837 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -160,11 +160,7 @@ static void vzDriverDispose(void * obj) { vzDriverPtr driver = obj; - if (driver->server) { - prlsdkUnsubscribeFromPCSEvents(driver); - prlsdkDisconnect(driver); - } - + prlsdkDisconnect(driver); virObjectUnref(driver->domains); virObjectUnref(driver->caps); virObjectUnref(driver->xmlopt); @@ -318,8 +314,7 @@ vzDriverObjNew(void) !(driver->domains = virDomainObjListNew()) || !(driver->domainEventState = virObjectEventStateNew()) || (vzInitVersion(driver) < 0) || - (prlsdkConnect(driver) < 0) || - (prlsdkSubscribeToPCSEvents(driver) < 0) + (prlsdkConnect(driver) < 0) ) { virObjectUnref(driver); return NULL; diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index a96fc96..5b425d7 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -39,6 +39,8 @@ static int prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid); +static PRL_RESULT +prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque); VIR_LOG_INIT("parallels.sdk"); @@ -284,41 +286,62 @@ prlsdkConnect(vzDriverPtr driver) job = PrlSrv_LoginLocalEx(driver->server, NULL, 0, PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE); if (PRL_FAILED(getJobResult(job, &result))) - goto cleanup; + goto destroy; pret = PrlResult_GetParam(result, &response); - prlsdkCheckRetGoto(pret, cleanup); + prlsdkCheckRetGoto(pret, logoff); pret = prlsdkGetStringParamBuf(PrlLoginResponse_GetSessionUuid, response, session_uuid, sizeof(session_uuid)); - prlsdkCheckRetGoto(pret, cleanup); + prlsdkCheckRetGoto(pret, logoff); if (prlsdkUUIDParse(session_uuid, driver->session_uuid) < 0) - goto cleanup; + goto logoff; + + pret = PrlSrv_RegEventHandler(driver->server, + prlsdkEventsHandler, + driver); + prlsdkCheckRetGoto(pret, logoff); ret = 0; cleanup: - if (ret < 0) { - PrlHandle_Free(driver->server); - driver->server = PRL_INVALID_HANDLE; - } - PrlHandle_Free(result); PrlHandle_Free(response); return ret; + + logoff: + job = PrlSrv_Logoff(driver->server); + waitJob(job); + + destroy: + PrlHandle_Free(driver->server); + driver->server = PRL_INVALID_HANDLE; + + goto cleanup; } void prlsdkDisconnect(vzDriverPtr driver) { PRL_HANDLE job; + PRL_RESULT ret; + + if (driver->server == PRL_INVALID_HANDLE) + return; + + ret = PrlSrv_UnregEventHandler(driver->server, + prlsdkEventsHandler, + driver); + if (PRL_FAILED(ret)) + logPrlError(ret); job = PrlSrv_Logoff(driver->server); waitJob(job); PrlHandle_Free(driver->server); + driver->server = PRL_INVALID_HANDLE; } static int @@ -1951,30 +1974,6 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque) return PRL_ERR_SUCCESS; } -int prlsdkSubscribeToPCSEvents(vzDriverPtr driver) -{ - PRL_RESULT pret = PRL_ERR_UNINITIALIZED; - - pret = PrlSrv_RegEventHandler(driver->server, - prlsdkEventsHandler, - driver); - prlsdkCheckRetGoto(pret, error); - return 0; - - error: - return -1; -} - -void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver) -{ - PRL_RESULT ret = PRL_ERR_UNINITIALIZED; - ret = PrlSrv_UnregEventHandler(driver->server, - prlsdkEventsHandler, - driver); - if (PRL_FAILED(ret)) - logPrlError(ret); -} - PRL_RESULT prlsdkStart(PRL_HANDLE sdkdom) { PRL_HANDLE job = PRL_INVALID_HANDLE; diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index 3d27d12..757e174 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -34,8 +34,6 @@ int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom); int prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom); -int prlsdkSubscribeToPCSEvents(vzDriverPtr driver); -void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver); PRL_RESULT prlsdkStart(PRL_HANDLE sdkdom); PRL_RESULT prlsdkKill(PRL_HANDLE sdkdom); PRL_RESULT prlsdkStop(PRL_HANDLE sdkdom); -- 1.8.3.1
participants (1)
-
Nikolay Shirokovskiy