]> xenbits.xensource.com Git - libvirt.git/commitdiff
getstats: add new flag for block backing chain
authorEric Blake <eblake@redhat.com>
Tue, 25 Nov 2014 15:46:49 +0000 (08:46 -0700)
committerEric Blake <eblake@redhat.com>
Wed, 17 Dec 2014 08:41:38 +0000 (01:41 -0700)
This patch introduces access to allocation information about
a backing chain of a live domain.  While querying storage
volumes for read-only disks could provide some of the details,
we do NOT want to read() a file while qemu is writing it.
Also, there is one case where we have to rely on qemu: when
doing a block commit into a backing file, where that file is
stored in qcow2 format on a host block device, we want to know
the current highest write offset into that image, in order to
know if the disk must be resized larger.  qemu-img does not
(currently) show this information, and none of the earlier
block APIs were extensible enough to expose it.  But
virDomainListGetStats is perfect for the job!

We don't need a new group of statistics, as the existing block
group is sufficient.  On the other hand, as existing libvirt
releases already report 1:1 mapping of block.count to <disk>
devices, changing the array size could confuse older clients;
and even with newer clients, the time and memory taken to
report additional statistics is not always necessary (backing
files are generally read-only except for block-commit, so while
read statistics may change, sizing statistics will not).  So
the choice here is to add a new flag that only newer callers
will pass, when they are prepared for the additional information.

This patch introduces the new API, but it will take more
patches to get it implemented for qemu.

* include/libvirt/libvirt-domain.h
(VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING): New flag.
* src/libvirt-domain.c (virConnectGetAllDomainStats): Document it,
and add a new field when it is in use.
* tools/virsh-domain-monitor.c (cmdDomstats): Use new flag.
* tools/virsh.pod (domstats): Document it.

Signed-off-by: Eric Blake <eblake@redhat.com>
include/libvirt/libvirt-domain.h
src/libvirt-domain.c
tools/virsh-domain-monitor.c
tools/virsh.pod

index baef32d809b958e71fd503986072e92809439f2a..0b1a2d6dd4d95a7436258881cd59da46ecbcc83d 100644 (file)
@@ -1705,6 +1705,7 @@ typedef enum {
     VIR_CONNECT_GET_ALL_DOMAINS_STATS_SHUTOFF = VIR_CONNECT_LIST_DOMAINS_SHUTOFF,
     VIR_CONNECT_GET_ALL_DOMAINS_STATS_OTHER = VIR_CONNECT_LIST_DOMAINS_OTHER,
 
+    VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING = 1 << 30, /* include backing chain for block stats */
     VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS = 1 << 31, /* enforce requested stats */
 } virConnectGetAllDomainStatsFlags;
 
index cb76d8ce58d745978727193efb3465a0780651b9..6ec68aa71770c72d7ebe72d78dd5069189f94d1d 100644 (file)
@@ -10903,13 +10903,22 @@ virConnectGetDomainCapabilities(virConnectPtr conn,
  * "net.<num>.tx.errs" - transmission errors as unsigned long long.
  * "net.<num>.tx.drop" - transmit packets dropped as unsigned long long.
  *
- * VIR_DOMAIN_STATS_BLOCK: Return block devices statistics.
+ * VIR_DOMAIN_STATS_BLOCK: Return block devices statistics.  By default,
+ * this information is limited to the active layer of each <disk> of the
+ * domain (where block.count is equal to the number of disks), but adding
+ * VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING to @flags will expand the
+ * array to cover backing chains (block.count corresponds to the number
+ * of host resources used together to provide the guest disks).
  * The typed parameter keys are in this format:
- * "block.count" - number of block devices on this domain
+ * "block.count" - number of block devices in the subsequent list,
  *                 as unsigned int.
  * "block.<num>.name" - name of the block device <num> as string.
  *                      matches the target name (vda/sda/hda) of the
- *                      block device.
+ *                      block device.  If the backing chain is listed,
+ *                      this name is the same for all host resources tied
+ *                      to the same guest device.
+ * "block.<num>.backingIndex" - unsigned int giving the <backingStore> index,
+ *                              only used when backing images are listed.
  * "block.<num>.path" - string describing the source of block device <num>,
  *                      if it is a file or block device (omitted for network
  *                      sources and drives with no media inserted).
index 259400ffa843e5c43faa6f70514732ca6765483b..214c0b29eb63945c74d8869b61588025f9dcf056 100644 (file)
@@ -2037,6 +2037,10 @@ static const vshCmdOptDef opts_domstats[] = {
      .type = VSH_OT_BOOL,
      .help = N_("enforce requested stats parameters"),
     },
+    {.name = "backing",
+     .type = VSH_OT_BOOL,
+     .help = N_("add backing chain information to block stats"),
+    },
     {.name = "domain",
      .type = VSH_OT_ARGV,
      .flags = VSH_OFLAG_NONE,
@@ -2130,6 +2134,9 @@ cmdDomstats(vshControl *ctl, const vshCmd *cmd)
     if (vshCommandOptBool(cmd, "enforce"))
         flags |= VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS;
 
+    if (vshCommandOptBool(cmd, "backing"))
+        flags |= VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING;
+
     if (vshCommandOptBool(cmd, "domain")) {
         if (VIR_ALLOC_N(domlist, 1) < 0)
             goto cleanup;
index 0eba2c1ceb880f09650ec0d5f165f09e5221869b..63b6035109111c8ede6226946b6e7bb73f932392 100644 (file)
@@ -825,7 +825,7 @@ that require a block device name (such as I<domblkinfo> or
 I<snapshot-create> for disk snapshots) will accept either target
 or unique source names printed by this command.
 
-=item B<domstats> [I<--raw>] [I<--enforce>] [I<--state>]
+=item B<domstats> [I<--raw>] [I<--enforce>] [I<--backing>] [I<--state>]
 [I<--cpu-total>] [I<--balloon>] [I<--vcpu>] [I<--interface>] [I<--block>]
 [[I<--list-active>] [I<--list-inactive>] [I<--list-persistent>]
 [I<--list-transient>] [I<--list-running>] [I<--list-paused>]
@@ -880,9 +880,16 @@ I<--interface> returns:
 "net.<num>.tx.errs" - number of transmission errors,
 "net.<num>.tx.drop" - number of transmit packets dropped
 
-I<--block> returns:
-"block.count" - number of block devices on this domain,
-"block.<num>.name" - name of the target of the block device <num>,
+I<--block> returns information about disks associated with each
+domain.  Using the I<--backing> flag extends this information to
+cover all resources in the backing chain, rather than the default
+of limiting information to the active layer for each guest disk.
+Information listed includes:
+"block.count" - number of block devices being listed,
+"block.<num>.name" - name of the target of the block device <num> (the
+same name for multiple entries if I<--backing> is present),
+"block.<num>.backingIndex" - when I<--backing> is present, matches up
+with the <backingStore> index listed in domain XML for backing files,
 "block.<num>.path" - file source of block device <num>, if it is a
 local file or block device,
 "block.<num>.rd.reqs" - number of read requests,