[libvirt] [dbus PATCH 15/15] Implement GetCPUStats method for Domain Interface
Katerina Koukiou
kkoukiou at redhat.com
Wed Apr 25 16:47:42 UTC 2018
On Wed, 2018-04-25 at 18:33 +0200, Pavel Hrdina wrote:
> On Wed, Apr 25, 2018 at 12:20:30PM +0200, Katerina Koukiou wrote:
> > Signed-off-by: Katerina Koukiou <kkoukiou at redhat.com>
> > ---
> > data/org.libvirt.Domain.xml | 8 ++++++
> > src/domain.c | 68
> > +++++++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 76 insertions(+)
> >
> > diff --git a/data/org.libvirt.Domain.xml
> > b/data/org.libvirt.Domain.xml
> > index 8d027dd..9292a91 100644
> > --- a/data/org.libvirt.Domain.xml
> > +++ b/data/org.libvirt.Domain.xml
> > @@ -191,6 +191,14 @@
> > <arg name="flags" type="u" direction="in"/>
> > <arg name="controlInfo" type="(sst)" direction="out"/>
> > </method>
> > + <method name="GetCPUStats">
> > + <annotation name="org.gtk.GDBus.DocString"
> > + value="See https://libvirt.org/html/libvirt-libvirt-domain
> > .html#virDomainGetCPUStats
> > + @total should be set to get total stats instead of
> > per-cpu stats."/>
>
> I would rephrase it:
>
> "If @total is True, it returns total cpu stats, otherwise it returns
> per-cpu stats."
>
> > + <arg name="total" type="b" direction="in"/>
> > + <arg name="flags" type="u" direction="in"/>
> > + <arg name="stats" type="a(sa{sv})" direction="out"/>
> > + </method>
> > <method name="GetDiskErrors">
> > <annotation name="org.gtk.GDBus.DocString"
> > value="See https://libvirt.org/html/libvirt-libvirt-domain
> > .html#virDomainGetDiskErrors"/>;
> > diff --git a/src/domain.c b/src/domain.c
> > index 608f1d1..1c09cc9 100644
> > --- a/src/domain.c
> > +++ b/src/domain.c
> > @@ -3,6 +3,8 @@
> >
> > #include <libvirt/libvirt.h>
> >
> > +#define VIRT_DBUS_DOMAIN_MAX_CPUS 128
> > +
> > VIRT_DBUS_ENUM_DECL(virtDBusDomainBlockJob)
> > VIRT_DBUS_ENUM_IMPL(virtDBusDomainBlockJob,
> > VIR_DOMAIN_BLOCK_JOB_TYPE_LAST,
> > @@ -1041,6 +1043,71 @@ virtDBusDomainGetControlInfo(GVariant
> > *inArgs,
> > errorReasonStr, controlInfo-
> > >stateTime);
> > }
> >
> > +static void
> > +virtDBusDomainGetCPUStats(GVariant *inArgs,
> > + GUnixFDList *inFDs G_GNUC_UNUSED,
> > + const gchar *objectPath,
> > + gpointer userData,
> > + GVariant **outArgs,
> > + GUnixFDList **outFDs G_GNUC_UNUSED,
> > + GError **error)
> > +{
> > + virtDBusConnect *connect = userData;
> > + g_autoptr(virDomain) domain = NULL;
> > + g_auto(virtDBusUtilTypedParams) params = { 0 };
> > + gint startCPU = 0;
> > + guint ncpus = VIRT_DBUS_DOMAIN_MAX_CPUS;
> > + gboolean total;
> > + guint flags;
> > + GVariant *gret;
> > + GVariantBuilder builder;
> > + gint ret;
> > +
> > + g_variant_get(inArgs, "(bu)", &total, &flags);
> > +
> > + domain = virtDBusDomainGetVirDomain(connect, objectPath,
> > error);
> > + if (!domain)
> > + return;
>
> So this libvirt API has really stupid design and it's super
> complicated,
> I'm considering dropping it completely since the only benefit of this
> API is that you can get per host cpu statistic for specific domain.
>
> However, if we decide to keep it, it has to be rewritten. Currently
> the
> code would report only first 128 host CPUs which is not correct.
>
> You can look at libvirt-python implementation [1] of this API to get
> the
> idea of how it needs to be done, basically if there is more than 128
> host CPUs, the virDomainGetCPUStats() needs to be called multiple
> times
> to get all statistics.
>
> [1] libvirt-override.c (libvirt_virDomainGetCPUStats)
>
> Pavel
Thanks for the heads up. So, I 'll drop it for now and I 'll leave it
for future.
Katerina
More information about the libvir-list
mailing list