[libvirt] [PATCH v2 2/3] cmdDomblkinfo: add --all to show all block devices info

Chen Hanxiao chen_han_xiao at 126.com
Fri Jun 15 08:58:44 UTC 2018



At 2018-06-15 05:41:48, "John Ferlan" <jferlan at redhat.com> wrote:
>
>
>On 06/11/2018 06:52 AM, Chen Hanxiao wrote:
>> From: Chen Hanxiao <chenhanxiao at gmail.com>
>> 
[...]
>> 
>
>Do you have networked disks in your domain configs? For a non running
>guest, t; otherwise, you would have noted:
>
># virsh domblkinfo $dom --all
>Target     Capacity        Allocation      Physical
>-----------------------------------------------------
>vda        10737418240     2086727680      10737418240
>error: internal error: missing storage backend for network files using
>iscsi protocol
>

Yes, I tested this cases.
This issue already existed for the original domblkinfo, so I didn't change this.
Maybe we should fix it in another patch.

>> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
>> index daa86e8310..22c0b740c6 100644
...
>> +        if (device) {
>> +            if (virAsprintf(&cap, "%.3lf %s", val_cap, unit_cap) < 0)
>> +                goto cleanup;
>> +
>> +            if (virAsprintf(&alloc, "%.3lf %s", val_alloc, unit_alloc) < 0)
>> +                goto cleanup;
>> +
>> +            if (virAsprintf(&phy, "%.3lf %s", val_phy, unit_phy) < 0)
>> +                goto cleanup;
>
>it would be fine I think to do:
>
>    if (virAsprintf(&cap, "%.3lf %s", val_cap, unit_cap) < 0 ||
>        virAsprintf(&alloc, "%.3lf %s", val_alloc, unit_alloc) < 0 ||
>        virAsprintf(&phy, "%.3lf %s", val_phy, unit_phy) < 0)
>        goto cleanup;
>
>But that's not required.
>

Looks much better, will be changed in the next series.

>> +
>> +            vshPrint(ctl, "%-10s %-15s %-15s %-15s\n",
[...]

>> +            ctxt->node = disks[i];
>> +            target = virXPathString("string(./target/@dev)", ctxt);
>> +
>> +            if (virDomainGetBlockInfo(dom, target, &info, 0) < 0)
>> +                goto cleanup;
>
>If the domain is not running, then it's possible to return an error for
>a networked disk (e.g. <source protocol='network' ...>)... This is
>because qemuDomainGetBlockInfo calls qemuStorageLimitsRefresh which
>calls qemuDomainStorageOpenStat and for non local storage the
>virStorageFileInitAs will eventually fail in virStorageFileBackendForType.
>
>A couple of options come to mind...
>
>... let the failure occur as is, so be it...
>
>... check the last error message for code == VIR_ERR_INTERNAL_ERROR and
>domain == VIR_FROM_STORAGE and we have a source protocol from an
>inactive domain, then assume it's a we cannot get there from here.
>
>... Other options?
>
>If we fail virDomainGetBlockInfo we could still display values as long
>as there's an appropriately placed  memset(&info, 0, sizeof(info)). That
>way we display only the name and 0's for everything else. Not optimal,
>but easily described in the man page that an inactive guest, using
>network protocol for storage may not be able to get the size values and
>virsh will display as 0's instead... or get more creative and display
>"-" for each size column.

I prefer this solutions.
Also, I think domblkinfo DOM DEVICE should follow this if it's a network disk.

>
>
>> +
>> +            cmdDomblkinfoPrint(ctl, &info, target, human, false);
>> +
>> +            VIR_FREE(target);
>> +        }
>> +    } else {
>> +        if (virDomainGetBlockInfo(dom, device, &info, 0) < 0)
>> +            goto cleanup;
>> +
>> +        cmdDomblkinfoPrint(ctl, &info, NULL, human, false);
>> +    }
>>  
>>      ret = true;
>>  
>>   cleanup:
>>      virshDomainFree(dom);
>> +    VIR_FREE(target);
>> +    VIR_FREE(disks);
>> +    xmlXPathFreeContext(ctxt);
>> +    xmlFreeDoc(xmldoc);
>>      return ret;
>>  }
>
>Taking the handle the error path option and a bit of poetic license,
>here's some diffs...

Will do in v3.
>
>     char *target = NULL;
>+    char *protocol = NULL;
>...
>     if (all) {
>+        bool active = virDomainIsActive(dom) == 1;
>+        int rc;
>+
>...
>         for (i = 0; i < ndisks; i++) {
>             ctxt->node = disks[i];
>+            protocol = virXPathString("string(./source/@protocol)", ctxt);
>             target = virXPathString("string(./target/@dev)", ctxt);
>...
>-            if (virDomainGetBlockInfo(dom, target, &info, 0) < 0)
>-                goto cleanup;
>+            rc = virDomainGetBlockInfo(dom, target, &info, 0);
>+
>+            if (rc < 0) {
>+                if (protocol && !active &&
>+                    virGetLastErrorCode() == VIR_ERR_INTERNAL_ERROR &&
>+                    virGetLastErrorDomain() == VIR_FROM_STORAGE)
>+                    memset(&info, 0, sizeof(info));
>+                else
>+                    goto cleanup;
>+            }
>...
>+    VIR_FREE(protocol);
>     VIR_FREE(target);
>
>>  
>> diff --git a/tools/virsh.pod b/tools/virsh.pod
>> index 3f3314a87e..e273011037 100644
>> --- a/tools/virsh.pod
>> +++ b/tools/virsh.pod
>> @@ -949,13 +949,16 @@ B<domstate> command says that a domain was paused due to I/O error.
>>  The B<domblkerror> command lists all block devices in error state and
>>  the error seen on each of them.
>>  
>> -=item B<domblkinfo> I<domain> I<block-device> [I<--human>]
>> +=item B<domblkinfo> I<domain> [I<block-device> I<--all>] [I<--human>]
>>  
>>  Get block device size info for a 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). If I<--human> is set, the
>>  output will have a human readable output.
>> +If I<--all> is set, the output will be a table showing all block devices
>> +size info associated with I<domain>.
>> +The I<--all> option takes precedence of the others.
>
>Depending on how to handle the inactive networked storage, the above
>changes slightly.
>
>Maybe someone else will have some thoughts on this as well - so let's
>give it a couple of days to get that kind of feedback before deciding
>what to do and posting another series. Of course once anything is pushed
>we may find a differing opinion ;-)
>

Agree. I'll post v3 next Monday.

Regards,
- Chen




More information about the libvir-list mailing list