[libvirt] [PATCH 0/3] keep subscription to performance events thru domain lifetime

Patches 1-2 are simple preparation steps. Patch 3 do the job. Nikolay Shirokovskiy (3): vz: simplify refcount on sdkdom in prlsdkLoadDomain vz: use consistent naming for different domain object in vz_driver.c vz: keep subscription to performance events thru domain lifetime src/vz/vz_driver.c | 182 +++++++++++++++++++++++++++++------------------------ src/vz/vz_sdk.c | 140 ++++++++++++----------------------------- src/vz/vz_sdk.h | 8 +-- src/vz/vz_utils.c | 10 +-- src/vz/vz_utils.h | 12 +--- 5 files changed, 144 insertions(+), 208 deletions(-) -- 1.8.3.1

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 7eb78ca..73bf748 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1615,17 +1615,16 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) prlsdkConvertDomainState(domainState, envId, dom); - if (!pdom->sdkdom) { - PrlHandle_AddRef(sdkdom); + if (pdom->sdkdom == PRL_INVALID_HANDLE) pdom->sdkdom = sdkdom; - } + else + PrlHandle_Free(sdkdom); if (autostart == PAO_VM_START_ON_LOAD) dom->autostart = 1; else dom->autostart = 0; - PrlHandle_Free(sdkdom); return 0; error: PrlHandle_Free(sdkdom); -- 1.8.3.1

03.06.2016 10:11, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 7eb78ca..73bf748 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1615,17 +1615,16 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom)
prlsdkConvertDomainState(domainState, envId, dom);
- if (!pdom->sdkdom) { - PrlHandle_AddRef(sdkdom); + if (pdom->sdkdom == PRL_INVALID_HANDLE)
This change implies knowledge that PRL_INVALID_HANDLE is equal to 0 while it is not obvious and we don't explicitly set pdom->sdkdom to PRL_INVALID_HANDLE when we allocate vzDomObj. Thus, this change doesn't seem to simply things, rather it complicates at least my understanding, and I think we could easily avoid it.
pdom->sdkdom = sdkdom; - } + else + PrlHandle_Free(sdkdom);
if (autostart == PAO_VM_START_ON_LOAD) dom->autostart = 1; else dom->autostart = 0;
- PrlHandle_Free(sdkdom); return 0; error: PrlHandle_Free(sdkdom);

Naming scheme is next: virDomainPtr domain; virDomainObjPtr dom; Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 158 ++++++++++++++++++++++++++--------------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 177a57a..aa10aa0 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -599,24 +599,24 @@ vzDomainLookupByName(virConnectPtr conn, const char *name) static int vzDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { - virDomainObjPtr privdom; + virDomainObjPtr dom; int ret = -1; - if (!(privdom = vzDomObjFromDomainRef(domain))) + if (!(dom = vzDomObjFromDomainRef(domain))) goto cleanup; - info->state = virDomainObjGetState(privdom, NULL); - info->memory = privdom->def->mem.cur_balloon; - info->maxMem = virDomainDefGetMemoryActual(privdom->def); - info->nrVirtCpu = virDomainDefGetVcpus(privdom->def); + info->state = virDomainObjGetState(dom, NULL); + info->memory = dom->def->mem.cur_balloon; + info->maxMem = virDomainDefGetMemoryActual(dom->def); + info->nrVirtCpu = virDomainDefGetVcpus(dom->def); info->cpuTime = 0; - if (virDomainObjIsActive(privdom)) { + if (virDomainObjIsActive(dom)) { unsigned long long vtime; size_t i; - for (i = 0; i < virDomainDefGetVcpus(privdom->def); ++i) { - if (prlsdkGetVcpuStats(privdom, i, &vtime) < 0) { + for (i = 0; i < virDomainDefGetVcpus(dom->def); ++i) { + if (prlsdkGetVcpuStats(dom, i, &vtime) < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("cannot read cputime for domain")); goto cleanup; @@ -627,42 +627,42 @@ vzDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) ret = 0; cleanup: - virDomainObjEndAPI(&privdom); + virDomainObjEndAPI(&dom); return ret; } static char * vzDomainGetOSType(virDomainPtr domain) { - virDomainObjPtr privdom; + virDomainObjPtr dom; char *ret = NULL; - if (!(privdom = vzDomObjFromDomain(domain))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; - ignore_value(VIR_STRDUP(ret, virDomainOSTypeToString(privdom->def->os.type))); + ignore_value(VIR_STRDUP(ret, virDomainOSTypeToString(dom->def->os.type))); cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } static int vzDomainIsPersistent(virDomainPtr domain) { - virDomainObjPtr privdom; + virDomainObjPtr dom; int ret = -1; - if (!(privdom = vzDomObjFromDomain(domain))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; ret = 1; cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } @@ -670,19 +670,19 @@ static int vzDomainGetState(virDomainPtr domain, int *state, int *reason, unsigned int flags) { - virDomainObjPtr privdom; + virDomainObjPtr dom; int ret = -1; virCheckFlags(0, -1); - if (!(privdom = vzDomObjFromDomain(domain))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; - *state = virDomainObjGetState(privdom, reason); + *state = virDomainObjGetState(dom, reason); ret = 0; cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } @@ -691,40 +691,40 @@ vzDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) { vzConnPtr privconn = domain->conn->privateData; virDomainDefPtr def; - virDomainObjPtr privdom; + virDomainObjPtr dom; char *ret = NULL; /* Flags checked by virDomainDefFormat */ - if (!(privdom = vzDomObjFromDomain(domain))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; def = (flags & VIR_DOMAIN_XML_INACTIVE) && - privdom->newDef ? privdom->newDef : privdom->def; + dom->newDef ? dom->newDef : dom->def; ret = virDomainDefFormat(def, privconn->driver->caps, flags); cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } static int vzDomainGetAutostart(virDomainPtr domain, int *autostart) { - virDomainObjPtr privdom; + virDomainObjPtr dom; int ret = -1; - if (!(privdom = vzDomObjFromDomain(domain))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; - *autostart = privdom->autostart; + *autostart = dom->autostart; ret = 0; cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } @@ -871,14 +871,14 @@ vzDomainGetVcpus(virDomainPtr domain, unsigned char *cpumaps, int maplen) { - virDomainObjPtr privdom = NULL; + virDomainObjPtr dom = NULL; size_t i; int ret = -1; - if (!(privdom = vzDomObjFromDomainRef(domain))) + if (!(dom = vzDomObjFromDomainRef(domain))) goto cleanup; - if (!virDomainObjIsActive(privdom)) { + if (!virDomainObjIsActive(dom)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot list vcpu pinning for an inactive domain")); @@ -891,14 +891,14 @@ vzDomainGetVcpus(virDomainPtr domain, for (i = 0; i < maxinfo; i++) { info[i].number = i; info[i].state = VIR_VCPU_RUNNING; - if (prlsdkGetVcpuStats(privdom, i, &info[i].cpuTime) < 0) + if (prlsdkGetVcpuStats(dom, i, &info[i].cpuTime) < 0) goto cleanup; } } if (cpumaps != NULL) { memset(cpumaps, 0, maplen * maxinfo); for (i = 0; i < maxinfo; i++) - virBitmapToDataBuf(privdom->def->cpumask, + virBitmapToDataBuf(dom->def->cpumask, VIR_GET_CPUMAP(cpumaps, maplen, i), maplen); } @@ -906,8 +906,8 @@ vzDomainGetVcpus(virDomainPtr domain, ret = maxinfo; cleanup: - if (privdom) - virDomainObjEndAPI(&privdom); + if (dom) + virDomainObjEndAPI(&dom); return ret; } @@ -1134,31 +1134,31 @@ static int vzCheckConfigUpdateFlags(virDomainObjPtr dom, unsigned int *flags) return 0; } -static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, +static int vzDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int flags) { int ret = -1; - vzConnPtr privconn = dom->conn->privateData; + vzConnPtr privconn = domain->conn->privateData; virDomainDeviceDefPtr dev = NULL; - virDomainObjPtr privdom = NULL; + virDomainObjPtr dom = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); - if (!(privdom = vzDomObjFromDomain(dom))) + if (!(dom = vzDomObjFromDomain(domain))) return -1; - if (vzCheckConfigUpdateFlags(privdom, &flags) < 0) + if (vzCheckConfigUpdateFlags(dom, &flags) < 0) goto cleanup; - dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps, + dev = virDomainDeviceDefParse(xml, dom->def, privconn->driver->caps, privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) goto cleanup; switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkAttachVolume(privconn->driver, privdom, dev->data.disk); + ret = prlsdkAttachVolume(privconn->driver, dom, dev->data.disk); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("disk attach failed")); @@ -1166,7 +1166,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, } break; case VIR_DOMAIN_DEVICE_NET: - ret = prlsdkAttachNet(privconn->driver, privdom, dev->data.net); + ret = prlsdkAttachNet(privconn->driver, dom, dev->data.net); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("network attach failed")); @@ -1182,42 +1182,42 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, ret = 0; cleanup: - virObjectUnlock(privdom); + virObjectUnlock(dom); return ret; } -static int vzDomainAttachDevice(virDomainPtr dom, const char *xml) +static int vzDomainAttachDevice(virDomainPtr domain, const char *xml) { - return vzDomainAttachDeviceFlags(dom, xml, + return vzDomainAttachDeviceFlags(domain, xml, VIR_DOMAIN_AFFECT_CONFIG | VIR_DOMAIN_AFFECT_LIVE); } -static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, +static int vzDomainDetachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int flags) { int ret = -1; - vzConnPtr privconn = dom->conn->privateData; + vzConnPtr privconn = domain->conn->privateData; virDomainDeviceDefPtr dev = NULL; - virDomainObjPtr privdom = NULL; + virDomainObjPtr dom = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); - privdom = vzDomObjFromDomain(dom); - if (privdom == NULL) + dom = vzDomObjFromDomain(domain); + if (dom == NULL) return -1; - if (vzCheckConfigUpdateFlags(privdom, &flags) < 0) + if (vzCheckConfigUpdateFlags(dom, &flags) < 0) goto cleanup; - dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps, + dev = virDomainDeviceDefParse(xml, dom->def, privconn->driver->caps, privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) goto cleanup; switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkDetachVolume(privdom, dev->data.disk); + ret = prlsdkDetachVolume(dom, dev->data.disk); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("disk detach failed")); @@ -1225,7 +1225,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, } break; case VIR_DOMAIN_DEVICE_NET: - ret = prlsdkDetachNet(privconn->driver, privdom, dev->data.net); + ret = prlsdkDetachNet(privconn->driver, dom, dev->data.net); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("network detach failed")); @@ -1241,14 +1241,14 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, ret = 0; cleanup: - virObjectUnlock(privdom); + virObjectUnlock(dom); return ret; } -static int vzDomainDetachDevice(virDomainPtr dom, const char *xml) +static int vzDomainDetachDevice(virDomainPtr domain, const char *xml) { - return vzDomainDetachDeviceFlags(dom, xml, + return vzDomainDetachDeviceFlags(domain, xml, VIR_DOMAIN_AFFECT_CONFIG | VIR_DOMAIN_AFFECT_LIVE); } @@ -1405,52 +1405,52 @@ vzDomainMemoryStats(virDomainPtr domain, } static int -vzDomainGetVcpusFlags(virDomainPtr dom, +vzDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags) { - virDomainObjPtr privdom = NULL; + virDomainObjPtr dom = NULL; int ret = -1; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG | VIR_DOMAIN_VCPU_MAXIMUM, -1); - if (!(privdom = vzDomObjFromDomain(dom))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; if (flags & VIR_DOMAIN_VCPU_MAXIMUM) - ret = virDomainDefGetVcpusMax(privdom->def); + ret = virDomainDefGetVcpusMax(dom->def); else - ret = virDomainDefGetVcpus(privdom->def); + ret = virDomainDefGetVcpus(dom->def); cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } -static int vzDomainGetMaxVcpus(virDomainPtr dom) +static int vzDomainGetMaxVcpus(virDomainPtr domain) { - return vzDomainGetVcpusFlags(dom, (VIR_DOMAIN_AFFECT_LIVE | - VIR_DOMAIN_VCPU_MAXIMUM)); + return vzDomainGetVcpusFlags(domain, (VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_VCPU_MAXIMUM)); } -static int vzDomainIsUpdated(virDomainPtr dom) +static int vzDomainIsUpdated(virDomainPtr domain) { - virDomainObjPtr privdom; + virDomainObjPtr dom; int ret = -1; /* As far as VZ domains are always updated (e.g. current==persistent), * we just check for domain existence */ - if (!(privdom = vzDomObjFromDomain(dom))) + if (!(dom = vzDomObjFromDomain(domain))) goto cleanup; ret = 0; cleanup: - if (privdom) - virObjectUnlock(privdom); + if (dom) + virObjectUnlock(dom); return ret; } -- 1.8.3.1

03.06.2016 10:11, Nikolay Shirokovskiy пишет:
Naming scheme is next:
virDomainPtr domain; virDomainObjPtr dom;
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 158 ++++++++++++++++++++++++++--------------------------- 1 file changed, 79 insertions(+), 79 deletions(-)
ACK

The approach of subscribing on first stat API call and then waiting for receiving of performance event from sdk to process the call originates in times when every vz libvirt connections spawns its own sdk connection. Thus without this waiting virsh stat call would return empty stats. Now with single sdk connection this scheme is unnecessary complicated. This patch subscribes to performance events on first domain appearence and unsubscribe on its removing. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 28 ++++++++--- src/vz/vz_sdk.c | 139 +++++++++++++++-------------------------------------- src/vz/vz_sdk.h | 8 +-- src/vz/vz_utils.c | 10 +--- src/vz/vz_utils.h | 12 +---- 5 files changed, 67 insertions(+), 130 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index aa10aa0..96221a0 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -613,10 +613,13 @@ vzDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) if (virDomainObjIsActive(dom)) { unsigned long long vtime; + vzDomObjPtr privdom; size_t i; + privdom = dom->privateData; + for (i = 0; i < virDomainDefGetVcpus(dom->def); ++i) { - if (prlsdkGetVcpuStats(dom, i, &vtime) < 0) { + if (prlsdkGetVcpuStats(privdom->stats, i, &vtime) < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("cannot read cputime for domain")); goto cleanup; @@ -887,11 +890,15 @@ vzDomainGetVcpus(virDomainPtr domain, if (maxinfo >= 1) { if (info != NULL) { + vzDomObjPtr privdom; + memset(info, 0, sizeof(*info) * maxinfo); + privdom = dom->privateData; + for (i = 0; i < maxinfo; i++) { info[i].number = i; info[i].state = VIR_VCPU_RUNNING; - if (prlsdkGetVcpuStats(dom, i, &info[i].cpuTime) < 0) + if (prlsdkGetVcpuStats(privdom->stats, i, &info[i].cpuTime) < 0) goto cleanup; } } @@ -1271,6 +1278,7 @@ vzDomainBlockStats(virDomainPtr domain, const char *path, virDomainBlockStatsPtr stats) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; int ret = -1; size_t i; int idx; @@ -1278,12 +1286,14 @@ vzDomainBlockStats(virDomainPtr domain, const char *path, if (!(dom = vzDomObjFromDomainRef(domain))) return -1; + privdom = dom->privateData; + if (*path) { if ((idx = virDomainDiskIndexByName(dom->def, path, false)) < 0) { virReportError(VIR_ERR_INVALID_ARG, _("invalid path: %s"), path); goto cleanup; } - if (prlsdkGetBlockStats(dom, dom->def->disks[idx], stats) < 0) + if (prlsdkGetBlockStats(privdom->stats, dom->def->disks[idx], stats) < 0) goto cleanup; } else { virDomainBlockStatsStruct s; @@ -1296,7 +1306,7 @@ vzDomainBlockStats(virDomainPtr domain, const char *path, #undef PARALLELS_ZERO_STATS for (i = 0; i < dom->def->ndisks; i++) { - if (prlsdkGetBlockStats(dom, dom->def->disks[i], &s) < 0) + if (prlsdkGetBlockStats(privdom->stats, dom->def->disks[i], &s) < 0) goto cleanup; #define PARALLELS_SUM_STATS(VAR, TYPE, NAME) \ @@ -1374,12 +1384,15 @@ vzDomainInterfaceStats(virDomainPtr domain, virDomainInterfaceStatsPtr stats) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; int ret; if (!(dom = vzDomObjFromDomainRef(domain))) return -1; - ret = prlsdkGetNetStats(dom, path, stats); + privdom = dom->privateData; + + ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, path, stats); virDomainObjEndAPI(&dom); return ret; @@ -1392,13 +1405,16 @@ vzDomainMemoryStats(virDomainPtr domain, unsigned int flags) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; int ret = -1; virCheckFlags(0, -1); if (!(dom = vzDomObjFromDomainRef(domain))) return -1; - ret = prlsdkGetMemoryStats(dom, stats, nr_stats); + privdom = dom->privateData; + + ret = prlsdkGetMemoryStats(privdom->stats, stats, nr_stats); virDomainObjEndAPI(&dom); return ret; diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 73bf748..e067574 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -467,8 +467,7 @@ prlsdkDomObjFreePrivate(void *p) return; PrlHandle_Free(pdom->sdkdom); - PrlHandle_Free(pdom->cache.stats); - virCondDestroy(&pdom->cache.cond); + PrlHandle_Free(pdom->stats); VIR_FREE(pdom->home); VIR_FREE(p); }; @@ -1513,6 +1512,7 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) PRL_UINT32 envId; PRL_VM_AUTOSTART_OPTION autostart; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE; + PRL_HANDLE job; virCheckNonNullArgGoto(dom, error); @@ -1604,6 +1604,16 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) goto error; } + if (pdom->sdkdom == PRL_INVALID_HANDLE) { + job = PrlVm_SubscribeToPerfStats(sdkdom, NULL); + if (PRL_FAILED(waitJob(job))) + goto error; + + pdom->sdkdom = sdkdom; + } else { + PrlHandle_Free(sdkdom); + } + /* assign new virDomainDef without any checks * we can't use virDomainObjAssignDef, because it checks * for state and domain name */ @@ -1615,11 +1625,6 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) prlsdkConvertDomainState(domainState, envId, dom); - if (pdom->sdkdom == PRL_INVALID_HANDLE) - pdom->sdkdom = sdkdom; - else - PrlHandle_Free(sdkdom); - if (autostart == PAO_VM_START_ON_LOAD) dom->autostart = 1; else @@ -1827,6 +1832,8 @@ prlsdkHandleVmRemovedEvent(vzDriverPtr driver, unsigned char *uuid) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; + PRL_HANDLE job; dom = virDomainObjListFindByUUID(driver->domains, uuid); /* domain was removed from the list from the libvirt @@ -1837,53 +1844,32 @@ prlsdkHandleVmRemovedEvent(vzDriverPtr driver, prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); + privdom = dom->privateData; + job = PrlVm_UnsubscribeFromPerfStats(privdom->sdkdom); + ignore_value(waitJob(job)); + virDomainObjListRemove(driver->domains, dom); return; } #define PARALLELS_STATISTICS_DROP_COUNT 3 -static PRL_RESULT +static void prlsdkHandlePerfEvent(vzDriverPtr driver, PRL_HANDLE event, unsigned char *uuid) { virDomainObjPtr dom = NULL; vzDomObjPtr privdom = NULL; - PRL_HANDLE job = PRL_INVALID_HANDLE; - dom = virDomainObjListFindByUUID(driver->domains, uuid); - if (dom == NULL) - goto cleanup; + if (!(dom = virDomainObjListFindByUUID(driver->domains, uuid))) + return; + privdom = dom->privateData; + PrlHandle_Free(privdom->stats); + privdom->stats = event; - /* delayed event after unsubscribe */ - if (privdom->cache.count == -1) - goto cleanup; - - PrlHandle_Free(privdom->cache.stats); - privdom->cache.stats = PRL_INVALID_HANDLE; - - if (privdom->cache.count > PARALLELS_STATISTICS_DROP_COUNT) { - job = PrlVm_UnsubscribeFromPerfStats(privdom->sdkdom); - if (PRL_FAILED(waitJob(job))) - goto cleanup; - /* change state to unsubscribed */ - privdom->cache.count = -1; - } else { - ++privdom->cache.count; - privdom->cache.stats = event; - /* thus we get own of event handle */ - event = PRL_INVALID_HANDLE; - virCondSignal(&privdom->cache.cond); - } - - cleanup: - PrlHandle_Free(event); - if (dom) - virObjectUnlock(dom); - - return PRL_ERR_SUCCESS; + virObjectUnlock(dom); } static PRL_RESULT @@ -3961,56 +3947,10 @@ prlsdkExtractStatsParam(PRL_HANDLE sdkstats, const char *name, long long *val) #define PARALLELS_STATISTICS_TIMEOUT (60 * 1000) -static int -prlsdkGetStatsParam(virDomainObjPtr dom, const char *name, long long *val) -{ - vzDomObjPtr privdom = dom->privateData; - PRL_HANDLE job = PRL_INVALID_HANDLE; - unsigned long long now; - - if (privdom->cache.stats != PRL_INVALID_HANDLE) { - /* reset count to keep subscribtion */ - privdom->cache.count = 0; - return prlsdkExtractStatsParam(privdom->cache.stats, name, val); - } - - if (privdom->cache.count == -1) { - job = PrlVm_SubscribeToPerfStats(privdom->sdkdom, NULL); - if (PRL_FAILED(waitJob(job))) - goto error; - } - - /* change state to subscribed in case of unsubscribed - or reset count so we stop unsubscribe attempts */ - privdom->cache.count = 0; - - if (virTimeMillisNow(&now) < 0) { - virReportSystemError(errno, "%s", _("Unable to get current time")); - goto error; - } - - while (privdom->cache.stats == PRL_INVALID_HANDLE) { - if (virCondWaitUntil(&privdom->cache.cond, &dom->parent.lock, - now + PARALLELS_STATISTICS_TIMEOUT) < 0) { - if (errno == ETIMEDOUT) { - virReportError(VIR_ERR_OPERATION_TIMEOUT, "%s", - _("Timeout on waiting statistics event.")); - goto error; - } else { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to wait on monitor condition")); - goto error; - } - } - } - - return prlsdkExtractStatsParam(privdom->cache.stats, name, val); - error: - return -1; -} - int -prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats) +prlsdkGetBlockStats(PRL_HANDLE sdkstats, + virDomainDiskDefPtr disk, + virDomainBlockStatsPtr stats) { virDomainDeviceDriveAddressPtr address; int idx; @@ -4042,7 +3982,7 @@ prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBloc #define PRLSDK_GET_STAT_PARAM(VAL, TYPE, NAME) \ if (virAsprintf(&name, "devices.%s%d.%s", prefix, idx, NAME) < 0) \ goto cleanup; \ - if (prlsdkGetStatsParam(dom, name, &stats->VAL) < 0) \ + if (prlsdkExtractStatsParam(sdkstats, name, &stats->VAL) < 0) \ goto cleanup; \ VIR_FREE(name); @@ -4060,20 +4000,19 @@ prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBloc static PRL_HANDLE -prlsdkFindNetByPath(virDomainObjPtr dom, const char *path) +prlsdkFindNetByPath(PRL_HANDLE sdkdom, const char *path) { PRL_UINT32 count = 0; - vzDomObjPtr privdom = dom->privateData; PRL_RESULT pret; size_t i; char *name = NULL; PRL_HANDLE net = PRL_INVALID_HANDLE; - pret = PrlVmCfg_GetNetAdaptersCount(privdom->sdkdom, &count); + pret = PrlVmCfg_GetNetAdaptersCount(sdkdom, &count); prlsdkCheckRetGoto(pret, error); for (i = 0; i < count; ++i) { - pret = PrlVmCfg_GetNetAdapter(privdom->sdkdom, i, &net); + pret = PrlVmCfg_GetNetAdapter(sdkdom, i, &net); prlsdkCheckRetGoto(pret, error); if (!(name = prlsdkGetStringParamVar(PrlVmDevNet_GetHostInterfaceName, @@ -4100,7 +4039,7 @@ prlsdkFindNetByPath(virDomainObjPtr dom, const char *path) } int -prlsdkGetNetStats(virDomainObjPtr dom, const char *path, +prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path, virDomainInterfaceStatsPtr stats) { int ret = -1; @@ -4109,7 +4048,7 @@ prlsdkGetNetStats(virDomainObjPtr dom, const char *path, PRL_RESULT pret; PRL_HANDLE net = PRL_INVALID_HANDLE; - net = prlsdkFindNetByPath(dom, path); + net = prlsdkFindNetByPath(sdkdom, path); if (net == PRL_INVALID_HANDLE) goto cleanup; @@ -4119,7 +4058,7 @@ prlsdkGetNetStats(virDomainObjPtr dom, const char *path, #define PRLSDK_GET_NET_COUNTER(VAL, NAME) \ if (virAsprintf(&name, "net.nic%d.%s", net_index, NAME) < 0) \ goto cleanup; \ - if (prlsdkGetStatsParam(dom, name, &stats->VAL) < 0) \ + if (prlsdkExtractStatsParam(sdkstats, name, &stats->VAL) < 0) \ goto cleanup; \ VIR_FREE(name); @@ -4143,7 +4082,7 @@ prlsdkGetNetStats(virDomainObjPtr dom, const char *path, } int -prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime) +prlsdkGetVcpuStats(PRL_HANDLE sdkstats, int idx, unsigned long long *vtime) { char *name = NULL; long long ptime = 0; @@ -4151,7 +4090,7 @@ prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime) if (virAsprintf(&name, "guest.vcpu%u.time", (unsigned int)idx) < 0) goto cleanup; - if (prlsdkGetStatsParam(dom, name, &ptime) < 0) + if (prlsdkExtractStatsParam(sdkstats, name, &ptime) < 0) goto cleanup; *vtime = ptime == -1 ? 0 : ptime; ret = 0; @@ -4162,7 +4101,7 @@ prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime) } int -prlsdkGetMemoryStats(virDomainObjPtr dom, +prlsdkGetMemoryStats(PRL_HANDLE sdkstats, virDomainMemoryStatPtr stats, unsigned int nr_stats) { @@ -4171,7 +4110,7 @@ prlsdkGetMemoryStats(virDomainObjPtr dom, size_t i = 0; #define PRLSDK_GET_COUNTER(NAME, VALUE) \ - if (prlsdkGetStatsParam(dom, NAME, &VALUE) < 0) \ + if (prlsdkExtractStatsParam(sdkstats, NAME, &VALUE) < 0) \ goto cleanup; \ #define PRLSDK_MEMORY_STAT_SET(TAG, VALUE) \ diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index f570560..1860c99 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -67,17 +67,17 @@ prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr int prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); int -prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); +prlsdkGetBlockStats(PRL_HANDLE sdkstats, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); int prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); int -prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); +prlsdkGetNetStats(PRL_HANDLE sdkstas, PRL_HANDLE sdkdom, const char *path, virDomainInterfaceStatsPtr stats); int -prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *time); +prlsdkGetVcpuStats(PRL_HANDLE sdkstas, int idx, unsigned long long *time); int -prlsdkGetMemoryStats(virDomainObjPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats); +prlsdkGetMemoryStats(PRL_HANDLE sdkstas, virDomainMemoryStatPtr stats, unsigned int nr_stats); void prlsdkDomObjFreePrivate(void *p); /* memsize is in MiB */ diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index 5427314..db23b72 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -172,13 +172,7 @@ vzNewDomain(vzDriverPtr driver, const char *name, const unsigned char *uuid) if (VIR_ALLOC(pdom) < 0) goto error; - if (virCondInit(&pdom->cache.cond) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize condition")); - goto error; - } - pdom->cache.stats = PRL_INVALID_HANDLE; - pdom->cache.count = -1; - + pdom->stats = PRL_INVALID_HANDLE; def->virtType = VIR_DOMAIN_VIRT_VZ; if (!(dom = virDomainObjListAdd(driver->domains, def, @@ -192,8 +186,6 @@ vzNewDomain(vzDriverPtr driver, const char *name, const unsigned char *uuid) return dom; error: - if (pdom && pdom->cache.count == -1) - virCondDestroy(&pdom->cache.cond); virDomainDefFree(def); VIR_FREE(pdom); return NULL; diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index 2a99b9f..f5bb40e 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -94,21 +94,11 @@ typedef struct _vzConn vzConn; typedef struct _vzConn *vzConnPtr; -struct _vzCountersCache { - PRL_HANDLE stats; - virCond cond; - /* = -1 - unsubscribed - > -1 - subscribed */ - int count; -}; - -typedef struct _vzCountersCache vzCountersCache; - struct vzDomObj { int id; char *home; PRL_HANDLE sdkdom; - vzCountersCache cache; + PRL_HANDLE stats; }; typedef struct vzDomObj *vzDomObjPtr; -- 1.8.3.1

03.06.2016 10:11, Nikolay Shirokovskiy пишет:
The approach of subscribing on first stat API call and then waiting for receiving of performance event from sdk to process the call originates in times when every vz libvirt connections spawns its own sdk connection. Thus without this waiting virsh stat call would return empty stats. Now with single sdk connection this scheme is unnecessary complicated.
This patch subscribes to performance events on first domain appearence and unsubscribe on its removing.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 28 ++++++++--- src/vz/vz_sdk.c | 139 +++++++++++++++-------------------------------------- src/vz/vz_sdk.h | 8 +-- src/vz/vz_utils.c | 10 +--- src/vz/vz_utils.h | 12 +---- 5 files changed, 67 insertions(+), 130 deletions(-)
ACK with comment inline. I'm gonna fix it myself, no need to resend. Maxim
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index aa10aa0..96221a0 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -613,10 +613,13 @@ vzDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
if (virDomainObjIsActive(dom)) { unsigned long long vtime; + vzDomObjPtr privdom; size_t i;
+ privdom = dom->privateData; + for (i = 0; i < virDomainDefGetVcpus(dom->def); ++i) { - if (prlsdkGetVcpuStats(dom, i, &vtime) < 0) { + if (prlsdkGetVcpuStats(privdom->stats, i, &vtime) < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("cannot read cputime for domain")); goto cleanup; @@ -887,11 +890,15 @@ vzDomainGetVcpus(virDomainPtr domain,
if (maxinfo >= 1) { if (info != NULL) { + vzDomObjPtr privdom; + memset(info, 0, sizeof(*info) * maxinfo); + privdom = dom->privateData; + for (i = 0; i < maxinfo; i++) { info[i].number = i; info[i].state = VIR_VCPU_RUNNING; - if (prlsdkGetVcpuStats(dom, i, &info[i].cpuTime) < 0) + if (prlsdkGetVcpuStats(privdom->stats, i, &info[i].cpuTime) < 0) goto cleanup; } } @@ -1271,6 +1278,7 @@ vzDomainBlockStats(virDomainPtr domain, const char *path, virDomainBlockStatsPtr stats) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; int ret = -1; size_t i; int idx; @@ -1278,12 +1286,14 @@ vzDomainBlockStats(virDomainPtr domain, const char *path, if (!(dom = vzDomObjFromDomainRef(domain))) return -1;
+ privdom = dom->privateData; + if (*path) { if ((idx = virDomainDiskIndexByName(dom->def, path, false)) < 0) { virReportError(VIR_ERR_INVALID_ARG, _("invalid path: %s"), path); goto cleanup; } - if (prlsdkGetBlockStats(dom, dom->def->disks[idx], stats) < 0) + if (prlsdkGetBlockStats(privdom->stats, dom->def->disks[idx], stats) < 0) goto cleanup; } else { virDomainBlockStatsStruct s; @@ -1296,7 +1306,7 @@ vzDomainBlockStats(virDomainPtr domain, const char *path, #undef PARALLELS_ZERO_STATS
for (i = 0; i < dom->def->ndisks; i++) { - if (prlsdkGetBlockStats(dom, dom->def->disks[i], &s) < 0) + if (prlsdkGetBlockStats(privdom->stats, dom->def->disks[i], &s) < 0) goto cleanup;
#define PARALLELS_SUM_STATS(VAR, TYPE, NAME) \ @@ -1374,12 +1384,15 @@ vzDomainInterfaceStats(virDomainPtr domain, virDomainInterfaceStatsPtr stats) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; int ret;
if (!(dom = vzDomObjFromDomainRef(domain))) return -1;
- ret = prlsdkGetNetStats(dom, path, stats); + privdom = dom->privateData; + + ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, path, stats); virDomainObjEndAPI(&dom);
return ret; @@ -1392,13 +1405,16 @@ vzDomainMemoryStats(virDomainPtr domain, unsigned int flags) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; int ret = -1;
virCheckFlags(0, -1); if (!(dom = vzDomObjFromDomainRef(domain))) return -1;
- ret = prlsdkGetMemoryStats(dom, stats, nr_stats); + privdom = dom->privateData; + + ret = prlsdkGetMemoryStats(privdom->stats, stats, nr_stats); virDomainObjEndAPI(&dom);
return ret; diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 73bf748..e067574 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -467,8 +467,7 @@ prlsdkDomObjFreePrivate(void *p) return;
PrlHandle_Free(pdom->sdkdom); - PrlHandle_Free(pdom->cache.stats); - virCondDestroy(&pdom->cache.cond); + PrlHandle_Free(pdom->stats); VIR_FREE(pdom->home); VIR_FREE(p); }; @@ -1513,6 +1512,7 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) PRL_UINT32 envId; PRL_VM_AUTOSTART_OPTION autostart; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE; + PRL_HANDLE job;
virCheckNonNullArgGoto(dom, error);
@@ -1604,6 +1604,16 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) goto error; }
+ if (pdom->sdkdom == PRL_INVALID_HANDLE) { + job = PrlVm_SubscribeToPerfStats(sdkdom, NULL); + if (PRL_FAILED(waitJob(job))) + goto error; + + pdom->sdkdom = sdkdom; + } else { + PrlHandle_Free(sdkdom); + } + /* assign new virDomainDef without any checks * we can't use virDomainObjAssignDef, because it checks * for state and domain name */ @@ -1615,11 +1625,6 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom)
prlsdkConvertDomainState(domainState, envId, dom);
- if (pdom->sdkdom == PRL_INVALID_HANDLE) - pdom->sdkdom = sdkdom; - else - PrlHandle_Free(sdkdom); - if (autostart == PAO_VM_START_ON_LOAD) dom->autostart = 1; else @@ -1827,6 +1832,8 @@ prlsdkHandleVmRemovedEvent(vzDriverPtr driver, unsigned char *uuid) { virDomainObjPtr dom = NULL; + vzDomObjPtr privdom; + PRL_HANDLE job;
dom = virDomainObjListFindByUUID(driver->domains, uuid); /* domain was removed from the list from the libvirt @@ -1837,53 +1844,32 @@ prlsdkHandleVmRemovedEvent(vzDriverPtr driver, prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);
+ privdom = dom->privateData; + job = PrlVm_UnsubscribeFromPerfStats(privdom->sdkdom); + ignore_value(waitJob(job)); +
This chunk is unnecessary because the domain is already removed.
virDomainObjListRemove(driver->domains, dom); return; }
#define PARALLELS_STATISTICS_DROP_COUNT 3
-static PRL_RESULT +static void prlsdkHandlePerfEvent(vzDriverPtr driver, PRL_HANDLE event, unsigned char *uuid) { virDomainObjPtr dom = NULL; vzDomObjPtr privdom = NULL; - PRL_HANDLE job = PRL_INVALID_HANDLE;
- dom = virDomainObjListFindByUUID(driver->domains, uuid); - if (dom == NULL) - goto cleanup; + if (!(dom = virDomainObjListFindByUUID(driver->domains, uuid))) + return; + privdom = dom->privateData; + PrlHandle_Free(privdom->stats); + privdom->stats = event;
- /* delayed event after unsubscribe */ - if (privdom->cache.count == -1) - goto cleanup; - - PrlHandle_Free(privdom->cache.stats); - privdom->cache.stats = PRL_INVALID_HANDLE; - - if (privdom->cache.count > PARALLELS_STATISTICS_DROP_COUNT) { - job = PrlVm_UnsubscribeFromPerfStats(privdom->sdkdom); - if (PRL_FAILED(waitJob(job))) - goto cleanup; - /* change state to unsubscribed */ - privdom->cache.count = -1; - } else { - ++privdom->cache.count; - privdom->cache.stats = event; - /* thus we get own of event handle */ - event = PRL_INVALID_HANDLE; - virCondSignal(&privdom->cache.cond); - } - - cleanup: - PrlHandle_Free(event); - if (dom) - virObjectUnlock(dom); - - return PRL_ERR_SUCCESS; + virObjectUnlock(dom); }
static PRL_RESULT @@ -3961,56 +3947,10 @@ prlsdkExtractStatsParam(PRL_HANDLE sdkstats, const char *name, long long *val)
#define PARALLELS_STATISTICS_TIMEOUT (60 * 1000)
-static int -prlsdkGetStatsParam(virDomainObjPtr dom, const char *name, long long *val) -{ - vzDomObjPtr privdom = dom->privateData; - PRL_HANDLE job = PRL_INVALID_HANDLE; - unsigned long long now; - - if (privdom->cache.stats != PRL_INVALID_HANDLE) { - /* reset count to keep subscribtion */ - privdom->cache.count = 0; - return prlsdkExtractStatsParam(privdom->cache.stats, name, val); - } - - if (privdom->cache.count == -1) { - job = PrlVm_SubscribeToPerfStats(privdom->sdkdom, NULL); - if (PRL_FAILED(waitJob(job))) - goto error; - } - - /* change state to subscribed in case of unsubscribed - or reset count so we stop unsubscribe attempts */ - privdom->cache.count = 0; - - if (virTimeMillisNow(&now) < 0) { - virReportSystemError(errno, "%s", _("Unable to get current time")); - goto error; - } - - while (privdom->cache.stats == PRL_INVALID_HANDLE) { - if (virCondWaitUntil(&privdom->cache.cond, &dom->parent.lock, - now + PARALLELS_STATISTICS_TIMEOUT) < 0) { - if (errno == ETIMEDOUT) { - virReportError(VIR_ERR_OPERATION_TIMEOUT, "%s", - _("Timeout on waiting statistics event.")); - goto error; - } else { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to wait on monitor condition")); - goto error; - } - } - } - - return prlsdkExtractStatsParam(privdom->cache.stats, name, val); - error: - return -1; -} - int -prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats) +prlsdkGetBlockStats(PRL_HANDLE sdkstats, + virDomainDiskDefPtr disk, + virDomainBlockStatsPtr stats) { virDomainDeviceDriveAddressPtr address; int idx; @@ -4042,7 +3982,7 @@ prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBloc #define PRLSDK_GET_STAT_PARAM(VAL, TYPE, NAME) \ if (virAsprintf(&name, "devices.%s%d.%s", prefix, idx, NAME) < 0) \ goto cleanup; \ - if (prlsdkGetStatsParam(dom, name, &stats->VAL) < 0) \ + if (prlsdkExtractStatsParam(sdkstats, name, &stats->VAL) < 0) \ goto cleanup; \ VIR_FREE(name);
@@ -4060,20 +4000,19 @@ prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBloc
static PRL_HANDLE -prlsdkFindNetByPath(virDomainObjPtr dom, const char *path) +prlsdkFindNetByPath(PRL_HANDLE sdkdom, const char *path) { PRL_UINT32 count = 0; - vzDomObjPtr privdom = dom->privateData; PRL_RESULT pret; size_t i; char *name = NULL; PRL_HANDLE net = PRL_INVALID_HANDLE;
- pret = PrlVmCfg_GetNetAdaptersCount(privdom->sdkdom, &count); + pret = PrlVmCfg_GetNetAdaptersCount(sdkdom, &count); prlsdkCheckRetGoto(pret, error);
for (i = 0; i < count; ++i) { - pret = PrlVmCfg_GetNetAdapter(privdom->sdkdom, i, &net); + pret = PrlVmCfg_GetNetAdapter(sdkdom, i, &net); prlsdkCheckRetGoto(pret, error);
if (!(name = prlsdkGetStringParamVar(PrlVmDevNet_GetHostInterfaceName, @@ -4100,7 +4039,7 @@ prlsdkFindNetByPath(virDomainObjPtr dom, const char *path) }
int -prlsdkGetNetStats(virDomainObjPtr dom, const char *path, +prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path, virDomainInterfaceStatsPtr stats) { int ret = -1; @@ -4109,7 +4048,7 @@ prlsdkGetNetStats(virDomainObjPtr dom, const char *path, PRL_RESULT pret; PRL_HANDLE net = PRL_INVALID_HANDLE;
- net = prlsdkFindNetByPath(dom, path); + net = prlsdkFindNetByPath(sdkdom, path); if (net == PRL_INVALID_HANDLE) goto cleanup;
@@ -4119,7 +4058,7 @@ prlsdkGetNetStats(virDomainObjPtr dom, const char *path, #define PRLSDK_GET_NET_COUNTER(VAL, NAME) \ if (virAsprintf(&name, "net.nic%d.%s", net_index, NAME) < 0) \ goto cleanup; \ - if (prlsdkGetStatsParam(dom, name, &stats->VAL) < 0) \ + if (prlsdkExtractStatsParam(sdkstats, name, &stats->VAL) < 0) \ goto cleanup; \ VIR_FREE(name);
@@ -4143,7 +4082,7 @@ prlsdkGetNetStats(virDomainObjPtr dom, const char *path, }
int -prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime) +prlsdkGetVcpuStats(PRL_HANDLE sdkstats, int idx, unsigned long long *vtime) { char *name = NULL; long long ptime = 0; @@ -4151,7 +4090,7 @@ prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime)
if (virAsprintf(&name, "guest.vcpu%u.time", (unsigned int)idx) < 0) goto cleanup; - if (prlsdkGetStatsParam(dom, name, &ptime) < 0) + if (prlsdkExtractStatsParam(sdkstats, name, &ptime) < 0) goto cleanup; *vtime = ptime == -1 ? 0 : ptime; ret = 0; @@ -4162,7 +4101,7 @@ prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime) }
int -prlsdkGetMemoryStats(virDomainObjPtr dom, +prlsdkGetMemoryStats(PRL_HANDLE sdkstats, virDomainMemoryStatPtr stats, unsigned int nr_stats) { @@ -4171,7 +4110,7 @@ prlsdkGetMemoryStats(virDomainObjPtr dom, size_t i = 0;
#define PRLSDK_GET_COUNTER(NAME, VALUE) \ - if (prlsdkGetStatsParam(dom, NAME, &VALUE) < 0) \ + if (prlsdkExtractStatsParam(sdkstats, NAME, &VALUE) < 0) \ goto cleanup; \
#define PRLSDK_MEMORY_STAT_SET(TAG, VALUE) \ diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index f570560..1860c99 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -67,17 +67,17 @@ prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr int prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); int -prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); +prlsdkGetBlockStats(PRL_HANDLE sdkstats, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); int prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); int -prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); +prlsdkGetNetStats(PRL_HANDLE sdkstas, PRL_HANDLE sdkdom, const char *path, virDomainInterfaceStatsPtr stats); int -prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *time); +prlsdkGetVcpuStats(PRL_HANDLE sdkstas, int idx, unsigned long long *time); int -prlsdkGetMemoryStats(virDomainObjPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats); +prlsdkGetMemoryStats(PRL_HANDLE sdkstas, virDomainMemoryStatPtr stats, unsigned int nr_stats); void prlsdkDomObjFreePrivate(void *p); /* memsize is in MiB */ diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index 5427314..db23b72 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -172,13 +172,7 @@ vzNewDomain(vzDriverPtr driver, const char *name, const unsigned char *uuid) if (VIR_ALLOC(pdom) < 0) goto error;
- if (virCondInit(&pdom->cache.cond) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize condition")); - goto error; - } - pdom->cache.stats = PRL_INVALID_HANDLE; - pdom->cache.count = -1; - + pdom->stats = PRL_INVALID_HANDLE; def->virtType = VIR_DOMAIN_VIRT_VZ;
if (!(dom = virDomainObjListAdd(driver->domains, def, @@ -192,8 +186,6 @@ vzNewDomain(vzDriverPtr driver, const char *name, const unsigned char *uuid) return dom;
error: - if (pdom && pdom->cache.count == -1) - virCondDestroy(&pdom->cache.cond); virDomainDefFree(def); VIR_FREE(pdom); return NULL; diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index 2a99b9f..f5bb40e 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -94,21 +94,11 @@ typedef struct _vzConn vzConn; typedef struct _vzConn *vzConnPtr;
-struct _vzCountersCache { - PRL_HANDLE stats; - virCond cond; - /* = -1 - unsubscribed - > -1 - subscribed */ - int count; -}; - -typedef struct _vzCountersCache vzCountersCache; - struct vzDomObj { int id; char *home; PRL_HANDLE sdkdom; - vzCountersCache cache; + PRL_HANDLE stats; };
typedef struct vzDomObj *vzDomObjPtr;

03.06.2016 10:11, Nikolay Shirokovskiy пишет:
Patches 1-2 are simple preparation steps. Patch 3 do the job.
Nikolay Shirokovskiy (3): vz: simplify refcount on sdkdom in prlsdkLoadDomain vz: use consistent naming for different domain object in vz_driver.c vz: keep subscription to performance events thru domain lifetime
src/vz/vz_driver.c | 182 +++++++++++++++++++++++++++++------------------------ src/vz/vz_sdk.c | 140 ++++++++++++----------------------------- src/vz/vz_sdk.h | 8 +-- src/vz/vz_utils.c | 10 +-- src/vz/vz_utils.h | 12 +--- 5 files changed, 144 insertions(+), 208 deletions(-)
Pushed now without #1 and #3 fixed a bit. Thanks. Maxim
participants (2)
-
Maxim Nestratov
-
Nikolay Shirokovskiy