1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-01-14 16:45:20 +00:00

qemu: Convert qemuConnectGetAllDomainStats to use new helpers

Use the new domain list collection helpers to avoid going through
virDomainPtrs.

This additionally implements filter capability when called through the
api that accepts domain list filters.
This commit is contained in:
Peter Krempa 2015-04-29 16:41:20 +02:00
parent 83726a14d2
commit 85d8ede9eb

@ -19807,26 +19807,25 @@ qemuConnectGetAllDomainStats(virConnectPtr conn,
unsigned int flags)
{
virQEMUDriverPtr driver = conn->privateData;
virDomainPtr *domlist = NULL;
virDomainObjPtr dom = NULL;
virDomainObjPtr *vms = NULL;
virDomainObjPtr vm;
size_t nvms;
virDomainStatsRecordPtr *tmpstats = NULL;
bool enforce = !!(flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS);
int ntempdoms;
int nstats = 0;
size_t i;
int ret = -1;
unsigned int privflags = 0;
unsigned int domflags = 0;
unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE);
if (ndoms)
virCheckFlags(VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING |
VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS, -1);
else
virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE |
VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING |
VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS, -1);
virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE |
VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING |
VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS, -1);
if (virConnectGetAllDomainStatsEnsureACL(conn) < 0)
return -1;
@ -19834,58 +19833,53 @@ qemuConnectGetAllDomainStats(virConnectPtr conn,
if (qemuDomainGetStatsCheckSupport(&stats, enforce) < 0)
return -1;
if (!ndoms) {
unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE);
if ((ntempdoms = virDomainObjListExport(driver->domains,
conn,
&domlist,
virConnectGetAllDomainStatsCheckACL,
lflags)) < 0)
goto cleanup;
ndoms = ntempdoms;
doms = domlist;
if (ndoms) {
if (virDomainObjListConvert(driver->domains, conn, doms, ndoms, &vms,
&nvms, virConnectGetAllDomainStatsCheckACL,
lflags, true) < 0)
return -1;
} else {
if (virDomainObjListCollect(driver->domains, conn, &vms, &nvms,
virConnectGetAllDomainStatsCheckACL,
lflags) < 0)
return -1;
}
if (VIR_ALLOC_N(tmpstats, ndoms + 1) < 0)
goto cleanup;
if (VIR_ALLOC_N(tmpstats, nvms + 1) < 0)
return -1;
if (qemuDomainGetStatsNeedMonitor(stats))
privflags |= QEMU_DOMAIN_STATS_HAVE_JOB;
for (i = 0; i < ndoms; i++) {
for (i = 0; i < nvms; i++) {
virDomainStatsRecordPtr tmp = NULL;
domflags = 0;
vm = vms[i];
if (!(dom = qemuDomObjFromDomain(doms[i])))
continue;
if (doms != domlist &&
!virConnectGetAllDomainStatsCheckACL(conn, dom->def)) {
virDomainObjEndAPI(&dom);
continue;
}
virObjectLock(vm);
if (HAVE_JOB(privflags) &&
qemuDomainObjBeginJob(driver, dom, QEMU_JOB_QUERY) == 0)
qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) == 0)
domflags |= QEMU_DOMAIN_STATS_HAVE_JOB;
/* else: without a job it's still possible to gather some data */
if (flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING)
domflags |= QEMU_DOMAIN_STATS_BACKING;
if (qemuDomainGetStats(conn, dom, stats, &tmp, domflags) < 0)
goto endjob;
if (qemuDomainGetStats(conn, vm, stats, &tmp, domflags) < 0) {
if (HAVE_JOB(domflags) && vm)
qemuDomainObjEndJob(driver, vm);
virObjectUnlock(vm);
goto cleanup;
}
if (tmp)
tmpstats[nstats++] = tmp;
if (HAVE_JOB(domflags))
qemuDomainObjEndJob(driver, dom);
qemuDomainObjEndJob(driver, vm);
virDomainObjEndAPI(&dom);
virObjectUnlock(vm);
}
*retStats = tmpstats;
@ -19893,15 +19887,9 @@ qemuConnectGetAllDomainStats(virConnectPtr conn,
ret = nstats;
endjob:
if (HAVE_JOB(domflags) && dom)
qemuDomainObjEndJob(driver, dom);
cleanup:
virDomainObjEndAPI(&dom);
virDomainStatsRecordListFree(tmpstats);
virObjectListFree(domlist);
virObjectListFreeCount(vms, nvms);
return ret;
}