On Wed, Oct 02, 2019 at 02:11:39PM +0200, Pavel Mores wrote:
On Wed, Oct 02, 2019 at 01:15:12PM +0200, Ján Tomko wrote:
> Real estate in the commit message summary is precious, so the e.g.
> part belongs in the commit message.
Right.
> Also, (unless some strange usage sneaked into our XML), <source> deals
> with the host-side where <target> says how the device appears in the
> guest, so 'targetless' is wrong here.
>
> On Tue, Oct 01, 2019 at 04:45:02PM +0200, Pavel Mores wrote:
> > virDomainGetBlockInfo() returns error if called on a disk with no target
>
> s/target/source/
Yes, sorry for the mixup.
> > (a targetless disk might be a removable media drive with no media in it,
> > for instance an empty CDROM drive).
> >
> > So far this caused the virsh domblkinfo --all command to abort and ignore
>
> Most of virsh commands correspond 1:1 to a libvirt API. It would be
> nicer if that was the case here, since now we have to guess what
> happened in the daemon, because we try to treat --all as
> --all-that-are-sensible-and-supported
Could you please elaborate? I don't have enough context yet, I'm not sure what
in particular the above means for this patch.
I mean that I do not consider the answer clear-cut.
For a single device invocation a failure in the libvirt API makes the virsh command
fail. For multi-device, we have to decide which failures are OK or not.
> > any remaining (not yet displayed) disk devices. This patch
fixes it by
> > ignoring virDomainGetBlockInfo() errors for CDROM and floppy drives,
> > similar to how it's done for network drives.
> >
>
> I don't think that's an approach that should be copied, see below
>
> >
https://bugzilla.redhat.com/show_bug.cgi?id=1619625
> >
> > Signed-off-by: Pavel Mores <pmores(a)redhat.com>
> > ---
> > tools/virsh-domain-monitor.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> >
> > diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> > index 0e2c4191d7..0f495c1a3f 100644
> > --- a/tools/virsh-domain-monitor.c
> > +++ b/tools/virsh-domain-monitor.c
> > @@ -473,6 +473,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
> > char *cap = NULL;
> > char *alloc = NULL;
> > char *phy = NULL;
> > + char *device_type = NULL;
> > vshTablePtr table = NULL;
> >
> > if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
> > @@ -510,6 +511,8 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
> > rc = virDomainGetBlockInfo(dom, target, &info, 0);
> >
> > if (rc < 0) {
> > + device_type = virXPathString("string(./@device)",
ctxt);
> > +
> > /* If protocol is present that's an indication of a
networked
> > * storage device which cannot provide statistics, so generate
> > * 0 based data and get the next disk. */
>
> This comment is misleading, we should be capable of getting statistics
> from gluster even for inactive domains. Which is probably the reason we
> only look for the presence of protocol if the API failed.
>
> > @@ -518,9 +521,16 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
> > virGetLastErrorDomain() == VIR_FROM_STORAGE) {
> > memset(&info, 0, sizeof(info));
> > vshResetLibvirtError();
> > + } else if (device_type != NULL &&
> > + (STRCASEEQ(device_type, "cdrom") ||
> > + STRCASEEQ(device_type, "floppy"))) {
> > + memset(&info, 0, sizeof(info));
> > + vshResetLibvirtError();
>
> What if the cdrom is not empty and the error was something else?
Whatever error occurs, you get dashes instead of actual numbers.
Yes, the question is whether an error for something else than an empty
source should be reported.
> To preserve that, doing a virXPathBoolean query on the source
element should
> say whether it makes sense to invoke the API or not. (Maybe fill in
> dashes instead of zeroes as proposed in the discussion last time [0])
Don't know if that's what you're talking about but I already get a dashed
output. For instance:
virsh # domblkinfo --all archlinux
Target Capacity Allocation Physical
--------------------------------------------------
vda 16106127360 6850265088 16108814336
sda - - -
fda - - -
If querying <source> beforehand is the right way I'm happy to fix the patch.
a) if we care about preserving the individual errors, please check for
source and skip the API call instead
b) if we do not, we can ignore all errors and simplify the code
Either way looks nicer to me than introducing a specific 'ResetError()'
call.
Jano
> Alternatively, we can resurrect that patch [1] that
optimistically
> ignored all errors and save ourselves the trouble of having to add
> another exception here later.
>
> Jano