[libvirt] [PATCH v2 10/10] Allow balloon driver collection to be adjusted dynamically

Daniel P. Berrange berrange at redhat.com
Thu Jul 11 14:47:51 UTC 2013


On Mon, Jul 08, 2013 at 03:20:36PM -0400, John Ferlan wrote:
> Use the virDomainSetMemoryStatsPeriodFlags() to pass a period defined by
> usage of a new --period option in order to set the collection period for the
> balloon driver. This may enable or disable the collection based on the value.
> 
> Add the --current, --live, & --config options to dommemstat.
> ---
>  docs/formatdomain.html.in    | 11 +++++++-
>  tools/virsh-domain-monitor.c | 66 ++++++++++++++++++++++++++++++++++++++++++--
>  2 files changed, 73 insertions(+), 4 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 93d2416..df84ed2 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -4660,7 +4660,16 @@ qemu-kvm -net nic,model=? /dev/null
>          <p>
>            The optional <code>period</code> allows the QEMU virtio memory
>            balloon driver to provide statistics through the <code>virsh
> -          dommemstat [domain]</code> command.
> +          dommemstat [domain]</code> command. By default, collection is
> +          not enabled. In order to enable, use the <code>virsh dommemstat
> +          [domain] --period [number]</code> command or <code>virsh edit</code>
> +          command to add the option to the XML definition.
> +          The <code>virsh dommemstat</code> will accept the options
> +          <code>--live</code>, <code>--current</code>, or <code>--config</code>.
> +          If an option is not provided, the change for a running domain will
> +          only be made to the active guest.
> +          If the QEMU driver is not at the right
> +          revision, the attempt to set the period will fail.
>            <span class='since'>Since 1.1.1, requires QEMU 1.5</span>
>          </p>
>        </dd>

Move this chunk into the patch which changes the  domaincommon.rng
file.

> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index 58d6d40..d2ed921 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -314,6 +314,23 @@ static const vshCmdOptDef opts_dommemstat[] = {
>       .flags = VSH_OFLAG_REQ,
>       .help = N_("domain name, id or uuid")
>      },
> +    {.name = "period",
> +     .type = VSH_OT_DATA,
> +     .flags = VSH_OFLAG_EMPTY_OK,
> +     .help = N_("period in seconds to set collection")
> +    },
> +    {.name = "config",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("affect next boot")
> +    },
> +    {.name = "live",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("affect running domain")
> +    },
> +    {.name = "current",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("affect current domain")
> +    },
>      {.name = NULL}
>  };
>  
> @@ -324,15 +341,56 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
>      const char *name;
>      struct _virDomainMemoryStat stats[VIR_DOMAIN_MEMORY_STAT_NR];
>      unsigned int nr_stats, i;
> +    int ret = false;
> +    int rv = 0;
> +    int period = -1;
> +    bool config = vshCommandOptBool(cmd, "config");
> +    bool live = vshCommandOptBool(cmd, "live");
> +    bool current = vshCommandOptBool(cmd, "current");
> +    unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
> +
> +    VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
> +    VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
> +    if (config)
> +        flags |= VIR_DOMAIN_AFFECT_CONFIG;
> +    if (live)
> +        flags |= VIR_DOMAIN_AFFECT_LIVE;
>  
>      if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
>          return false;
>  
> +    /* If none of the options were specified and we're active
> +     * then be sure to allow active modification */
> +    if (!current && !live && !config && virDomainIsActive(dom) == 1)
> +        flags |= VIR_DOMAIN_AFFECT_LIVE;
> +
> +    /* Providing a period will adjust the balloon driver collection period.
> +     * This is not really an unsigned long, but it
> +     */
> +    if ((rv = vshCommandOptInt(cmd, "period", &period)) < 0) {
> +        vshError(ctl, "%s",
> +                 _("Unable to parse integer parameter."));
> +        goto cleanup;
> +    }
> +    if (rv > 0) {
> +        if (period < 0) {
> +            vshError(ctl, _("Invalid collection period value '%d'"), period);
> +            goto cleanup;
> +        }
> +
> +        if (virDomainSetMemoryStatsPeriodFlags(dom, period, flags) < 0) {
> +            vshError(ctl, "%s",
> +                     _("Unable to change balloon collection period."));
> +        } else {
> +            ret = true;
> +        }
> +        goto cleanup;
> +    }
> +
>      nr_stats = virDomainMemoryStats(dom, stats, VIR_DOMAIN_MEMORY_STAT_NR, 0);
>      if (nr_stats == -1) {
>          vshError(ctl, _("Failed to get memory statistics for domain %s"), name);
> -        virDomainFree(dom);
> -        return false;
> +        goto cleanup;
>      }
>  
>      for (i = 0; i < nr_stats; i++) {
> @@ -354,8 +412,10 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
>              vshPrint(ctl, "rss %llu\n", stats[i].val);
>      }
>  
> +    ret = true;
> +cleanup:
>      virDomainFree(dom);
> -    return true;
> +    return ret;
>  }

I think the virsh.pod entry for this command could do with updating.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list