[libvirt] [PATCHv2 6/6] Widening API change - accept empty path for virDomainBlockStats

Gao feng gaofeng at cn.fujitsu.com
Thu Jan 23 10:24:07 UTC 2014


On 01/20/2014 07:12 PM, Thorsten Behrens wrote:
> And provide domain summary stat in that case, for lxc backend.
> Use case is a container inheriting all devices from the host,
> e.g. when doing application containerization.
> ---
> 
> Notes on v2:
>  - adapted virDomainBlockStats docs
>  - adapted virsh domblkstat docs
>  - made virsh actually accept empty disk argument
>  - pedaling back a bit on the API change - accepting a NULL ptr
>    for the disk arg would need changing the remote protocol, so
>    better just take the empty string. Makes this less invasive even.
> 
>  src/libvirt.c                |  8 ++++++--
>  src/lxc/lxc_driver.c         | 10 ++++++++++
>  tools/virsh-domain-monitor.c | 11 ++++++++---
>  tools/virsh.pod              |  5 +++--
>  4 files changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 87a4d46..ead0813 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -7781,7 +7781,9 @@ error:
>   * an unambiguous source name of the block device (the <source
>   * file='...'/> sub-element, such as "/path/to/image").  Valid names
>   * can be found by calling virDomainGetXMLDesc() and inspecting
> - * elements within //domain/devices/disk.
> + * elements within //domain/devices/disk. Some drivers might also
> + * accept the empty string for the @disk parameter, and then yield
> + * summary stats for the entire domain.
>   *
>   * Domains may have more than one block device.  To get stats for
>   * each you should make multiple calls to this function.
> @@ -7847,7 +7849,9 @@ error:
>   * an unambiguous source name of the block device (the <source
>   * file='...'/> sub-element, such as "/path/to/image").  Valid names
>   * can be found by calling virDomainGetXMLDesc() and inspecting
> - * elements within //domain/devices/disk.
> + * elements within //domain/devices/disk. Some drivers might also
> + * accept the empty string for the @disk parameter, and then yield
> + * summary stats for the entire domain.
>   *
>   * Domains may have more than one block device.  To get stats for
>   * each you should make multiple calls to this function.
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index bf6fd5c..31f1625 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -2046,6 +2046,16 @@ lxcDomainBlockStats(virDomainPtr dom,
>          goto cleanup;
>      }
>  
> +    if (!*path) {
> +        /* empty path - return entire domain blkstats instead */
> +        ret = virCgroupGetBlkioIoServiced(priv->cgroup,
> +                                          &stats->rd_bytes,
> +                                          &stats->wr_bytes,
> +                                          &stats->rd_req,
> +                                          &stats->wr_req);
> +        goto cleanup;
> +    }
> +
>      if ((idx = virDomainDiskIndexByName(vm->def, path, false)) < 0) {
>          virReportError(VIR_ERR_INVALID_ARG,
>                         _("invalid path: %s"), path);
> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index b29b82a..6be253f 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -880,7 +880,7 @@ static const vshCmdOptDef opts_domblkstat[] = {
>      },
>      {.name = "device",
>       .type = VSH_OT_DATA,
> -     .flags = VSH_OFLAG_REQ,
> +     .flags = VSH_OFLAG_EMPTY_OK,
>       .help = N_("block device")
>      },
>      {.name = "human",
> @@ -946,8 +946,13 @@ cmdDomblkstat(vshControl *ctl, const vshCmd *cmd)
>      if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
>          return false;
>  
> -    if (vshCommandOptStringReq(ctl, cmd, "device", &device) < 0)
> -        goto cleanup;
> +    /* device argument is optional now. if it's missing, supply empty
> +       string to denote 'all devices'. A NULL device arg would violate
> +       API contract.
> +     */
> +    rc = vshCommandOptStringReq(ctl, cmd, "device", &device); /* and ignore rc */
> +    if (!device)
> +        device = "";
>  
>      rc = virDomainBlockStatsFlags(dom, device, NULL, &nparams, 0);
>  
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 3534b54..c3ca016 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -616,12 +616,13 @@ If I<--graceful> is specified, don't resort to extreme measures
>  (e.g. SIGKILL) when the guest doesn't stop after a reasonable timeout;
>  return an error instead.
>  
> -=item B<domblkstat> I<domain> I<block-device> [I<--human>]
> +=item B<domblkstat> I<domain> [I<block-device>] [I<--human>]
>  
>  Get device block stats for a running domain.  A I<block-device> corresponds
>  to a unique target name (<target dev='name'/>) or source file (<source
>  file='name'/>) for one of the disk devices attached to I<domain> (see
> -also B<domblklist> for listing these names).
> +also B<domblklist> for listing these names). On a lxc domain, omitting the
> +I<block-device> yields device block stats summarily for the entire domain.
>  
>  Use I<--human> for a more human readable output.
>  
> 

Looks good to me

ACK

thanks!




More information about the libvir-list mailing list