[libvirt] [PATCH 11/12] getstats: split block stats reporting for easier recursion
Peter Krempa
pkrempa at redhat.com
Mon Dec 8 14:41:55 UTC 2014
On 12/06/14 09:14, Eric Blake wrote:
> In order to report stats on backing chains, we need to separate
> the output of stats for one block from how we traverse blocks.
>
> * src/qemu/qemu_driver.c (qemuDomainGetStatsBlock): Split...
> (qemuDomainGetStatsOneBlock): ...into new helper.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> src/qemu/qemu_driver.c | 127 ++++++++++++++++++++++++++++++-------------------
> 1 file changed, 77 insertions(+), 50 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index cb80f49..feaa4a2 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -18529,6 +18529,79 @@ do { \
> goto cleanup; \
> } while (0)
>
> +
> +static int
> +qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver,
> + virQEMUDriverConfigPtr cfg,
> + virDomainObjPtr dom,
> + virDomainStatsRecordPtr record,
> + int *maxparams,
> + virDomainDiskDefPtr disk,
> + virStorageSourcePtr src,
This is again a bit strange. I think that for other than top-level disks
also should be gathered via monitor. In that case we'll need a way to
'alias' them from qemu's point of view in an uniform way - perhaps -
node names?
> + size_t block_idx,
> + bool abbreviated,
> + virHashTablePtr stats)
> +{
> + qemuBlockStats *entry;
> + int ret = -1;
> +
> + QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", block_idx,
> + disk->dst);
> + if (virStorageSourceIsLocalStorage(src) && src->path)
> + QEMU_ADD_NAME_PARAM(record, maxparams, "block", "path",
> + block_idx, src->path);
> +
> + if (abbreviated || !disk->info.alias ||
> + !(entry = virHashLookup(stats, disk->info.alias))) {
> + if (qemuStorageLimitsRefresh(driver, cfg, dom,
> + disk, src, NULL, NULL) < 0)
...
> + goto cleanup;
> + if (src->allocation)
> + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
> + "allocation", src->allocation);
> + if (src->capacity)
> + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
> + "capacity", src->capacity);
> + if (src->physical)
> + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
> + "physical", src->physical);
> + ret = 0;
> + goto cleanup;
> + }
> +
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "rd.reqs", entry->rd_req);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "rd.bytes", entry->rd_bytes);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "rd.times", entry->rd_total_times);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "wr.reqs", entry->wr_req);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "wr.bytes", entry->wr_bytes);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "wr.times", entry->wr_total_times);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "fl.reqs", entry->flush_req);
> + QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
> + "fl.times", entry->flush_total_times);
> +
> + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
> + "allocation", entry->wr_highest_offset);
> +
> + if (entry->capacity)
> + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
> + "capacity", entry->capacity);
> + if (entry->physical)
> + QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
> + "physical", entry->physical);
> +
> + ret = 0;
> + cleanup:
> + return ret;
> +}
> +
> +
> static int
> qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
> virDomainObjPtr dom,
The recursive approach will be necessary, but I don't really like this
step where we gather the data differently for non-toplevel images.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141208/750c4f0b/attachment-0001.sig>
More information about the libvir-list
mailing list