[libvirt] [PATCH 8/8] latency: Update cmdBlkStats to use new API
Osier Yang
jyang at redhat.com
Tue Sep 6 04:04:49 UTC 2011
于 2011年09月06日 11:59, Daniel Veillard 写道:
> On Mon, Sep 05, 2011 at 04:38:35PM +0800, Osier Yang wrote:
>> The modified function fallbacks to use virDomainBlockStats if
>> virDomainBlockStatsFlags is not supported by the hypervisor driver.
>> If the new API is supported, it will be invoked instead of the
>> old API.
>> ---
>> tools/virsh.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++-----------
>> 1 files changed, 84 insertions(+), 20 deletions(-)
>>
>> diff --git a/tools/virsh.c b/tools/virsh.c
>> index c7240e5..ea41221 100644
>> --- a/tools/virsh.c
>> +++ b/tools/virsh.c
>> @@ -1070,6 +1070,9 @@ cmdDomblkstat (vshControl *ctl, const vshCmd *cmd)
>> virDomainPtr dom;
>> const char *name = NULL, *device = NULL;
>> struct _virDomainBlockStats stats;
>> + virTypedParameterPtr params = NULL;
>> + int rc, nparams = 0;
>> + bool ret = false;
>>
>> if (!vshConnectionUsability (ctl, ctl->conn))
>> return false;
>> @@ -1077,34 +1080,95 @@ cmdDomblkstat (vshControl *ctl, const vshCmd *cmd)
>> if (!(dom = vshCommandOptDomain (ctl, cmd,&name)))
>> return false;
>>
>> - if (vshCommandOptString (cmd, "device",&device)<= 0) {
>> - virDomainFree(dom);
>> - return false;
>> - }
>> + if (vshCommandOptString (cmd, "device",&device)<= 0)
>> + goto cleanup;
>>
>> - if (virDomainBlockStats (dom, device,&stats, sizeof stats) == -1) {
>> - vshError(ctl, _("Failed to get block stats %s %s"), name, device);
>> - virDomainFree(dom);
>> - return false;
>> - }
>> + rc = virDomainBlockStatsFlags(dom, device, NULL,&nparams, 0);
>>
>> - if (stats.rd_req>= 0)
>> - vshPrint (ctl, "%s rd_req %lld\n", device, stats.rd_req);
>> + /* It might fail when virDomainBlockStatsFlags is not
>> + * supported on older libvirt, fallback to use virDomainBlockStats
>> + * then.
>> + */
>> + if (rc< 0) {
>> + if (last_error->code != VIR_ERR_NO_SUPPORT) {
>> + virshReportError(ctl);
>> + goto cleanup;
>> + } else {
>> + virFreeError(last_error);
>> + last_error = NULL;
>>
>> - if (stats.rd_bytes>= 0)
>> - vshPrint (ctl, "%s rd_bytes %lld\n", device, stats.rd_bytes);
>> + if (virDomainBlockStats (dom, device,&stats,
>> + sizeof stats) == -1) {
>> + vshError(ctl, _("Failed to get block stats %s %s"),
>> + name, device);
>> + goto cleanup;
>> + }
>> +
>> + if (stats.rd_req>= 0)
>> + vshPrint (ctl, "%s rd_req %lld\n", device, stats.rd_req);
>>
>> - if (stats.wr_req>= 0)
>> - vshPrint (ctl, "%s wr_req %lld\n", device, stats.wr_req);
>> + if (stats.rd_bytes>= 0)
>> + vshPrint (ctl, "%s rd_bytes %lld\n", device, stats.rd_bytes);
>>
>> - if (stats.wr_bytes>= 0)
>> - vshPrint (ctl, "%s wr_bytes %lld\n", device, stats.wr_bytes);
>> + if (stats.wr_req>= 0)
>> + vshPrint (ctl, "%s wr_req %lld\n", device, stats.wr_req);
>>
>> - if (stats.errs>= 0)
>> - vshPrint (ctl, "%s errs %lld\n", device, stats.errs);
>> + if (stats.wr_bytes>= 0)
>> + vshPrint (ctl, "%s wr_bytes %lld\n", device, stats.wr_bytes);
>>
>> + if (stats.errs>= 0)
>> + vshPrint (ctl, "%s errs %lld\n", device, stats.errs);
>> + }
>> + } else {
>> + params = vshMalloc(ctl, sizeof(*params) * nparams);
>> + memset(params, 0, sizeof(*params) * nparams);
>> +
>> + if (virDomainBlockStatsFlags (dom, device, params,&nparams, 0)< 0) {
>> + vshError(ctl, _("Failed to get block stats %s %s"), name, device);
>> + goto cleanup;
>> + }
>> +
>> + int i;
>> + /* XXX: The output sequence will be different. */
>> + for (i = 0; i< nparams; i++) {
>> + switch(params[i].type) {
>> + case VIR_TYPED_PARAM_INT:
>> + vshPrint (ctl, "%s %s %d\n", device,
>> + params[i].field, params[i].value.i);
>> + break;
>> + case VIR_TYPED_PARAM_UINT:
>> + vshPrint (ctl, "%s %s %u\n", device,
>> + params[i].field, params[i].value.ui);
>> + break;
>> + case VIR_TYPED_PARAM_LLONG:
>> + vshPrint (ctl, "%s %s %lld\n", device,
>> + params[i].field, params[i].value.l);
>> + break;
>> + case VIR_TYPED_PARAM_ULLONG:
>> + vshPrint (ctl, "%s %s %llu\n", device,
>> + params[i].field, params[i].value.ul);
>> + break;
>> + case VIR_TYPED_PARAM_DOUBLE:
>> + vshPrint (ctl, "%s %s %f\n", device,
>> + params[i].field, params[i].value.d);
>> + break;
>> + case VIR_TYPED_PARAM_BOOLEAN:
>> + vshPrint (ctl, "%s %s %s\n", device,
>> + params[i].field, params[i].value.b ? _("yes") : _("no"));
>> + break;
>> + default:
>> + vshError(ctl, _("unimplemented block statistics parameter type"));
>> + }
>> +
>> + }
>> + }
>> +
>> + ret = true;
>> +
>> +cleanup:
>> + VIR_FREE(params);
>> virDomainFree(dom);
>> - return true;
>> + return ret;
>> }
>
> the title should indicate it's only for virsh
> I hope the change of order for returned values won't introduce
> regressions...
>
> ACK
>
> Daniel
>
I pushed series, with title of this patch changed into:
latency: Update virsh command domblkstat to use new API
Thanks !
Regards
Osier
More information about the libvir-list
mailing list