[libvirt] [PATCH] virsh: fix no error output when parse cpulist fail

Ján Tomko jtomko at redhat.com
Wed May 6 11:28:10 UTC 2015


On Wed, May 06, 2015 at 01:30:55PM +0800, Luyao Huang wrote:
> When we pass a invalid cpulist or the lastcpu in the
> cpulist exceed the maxcpu, we cannot get any error.
> like this:
> 
>  # virsh vcpupin test3 1 aaa
> 
>  # virsh vcpupin test3 1 1000
> 
> Because virBitmapParse() use virReportError() to set
> the error message, virsh client use vshError to output error.
> If we want get the error which set by virReportError(), we need
> virGetLastError/virGetLastErrorMessage to help us.

vshCommandRun would output the error in vshReportError, but in the
meantime it is overwriten by the virResetLastError in virDomainFree.

We have a vshSaveLibvirtError helper that can be used here to save
the error from virBitmap* APIs from being reset by virDomainFree,
if we decide to use it.

> However instead of do this, i chose use vshError to output
> error when parse failed.
> 
> Signed-off-by: Luyao Huang <lhuang at redhat.com>
> ---
>  tools/virsh-domain.c | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 14e1e35..64bfbfd 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -6362,9 +6362,7 @@ vshParseCPUList(int *cpumaplen, const char *cpulist, int maxcpu)
>              return NULL;
>      }
>  
> -    if (virBitmapToData(map, &cpumap, cpumaplen) < 0)
> -        goto cleanup;
> -
> +    virBitmapToData(map, &cpumap, cpumaplen);

This change is unrelated to the rest of the patch and while it looks
nicer I am afraid that leaving the return value unchecked here would make
coverity complain.

I wrote it with the redundant 'goto cleanup', because I didn't want to
leave it unchecked and I don't like the ignore_value macro.

>   cleanup:
>      virBitmapFree(map);
>      return cpumap;
> @@ -6458,8 +6456,10 @@ cmdVcpuPin(vshControl *ctl, const vshCmd *cmd)
>          }
>      } else {
>          /* Pin mode: pinning specified vcpu to specified physical cpus*/
> -        if (!(cpumap = vshParseCPUList(&cpumaplen, cpulist, maxcpu)))
> +        if (!(cpumap = vshParseCPUList(&cpumaplen, cpulist, maxcpu))) {
> +            vshError(ctl, _("vcpupin: invalid cpulist '%s'"), cpulist);

We do not include the command name for other errors.

If we reused the error from virBitmapParse, we'd get:
error: invalid argument: Failed to parse bitmap '11'

It's a bit more confusing than 'invalid cpulist' (especially since 11
is a wrong bitmap because I only have 4 host CPUs).

I wonder if it's better to fix virBitmapParse to report better errors
(e.g. number out of range) and use it here, or just report generic
"invalid cpulist" for all cases.

>              goto cleanup;
> +        }
>  
>          if (flags == -1) {
>              if (virDomainPinVcpu(dom, vcpu, cpumap, cpumaplen) != 0)
> @@ -6577,8 +6577,10 @@ cmdEmulatorPin(vshControl *ctl, const vshCmd *cmd)
>      }
>  
>      /* Pin mode: pinning emulator threads to specified physical cpus*/
> -    if (!(cpumap = vshParseCPUList(&cpumaplen, cpulist, maxcpu)))
> +    if (!(cpumap = vshParseCPUList(&cpumaplen, cpulist, maxcpu))) {
> +        vshError(ctl, _("emulatorpin: invalid cpulist '%s'"), cpulist);
>          goto cleanup;
> +    }
>  
>      if (flags == -1)
>          flags = VIR_DOMAIN_AFFECT_LIVE;
> @@ -6854,16 +6856,14 @@ cmdIOThreadPin(vshControl *ctl, const vshCmd *cmd)
>          goto cleanup;
>      }
>  
> -    if (vshCommandOptString(cmd, "cpulist", &cpulist) < 0) {
> -        vshError(ctl, "%s", _("iothreadpin: invalid cpulist."));
> -        goto cleanup;
> -    }
> -
>      if ((maxcpu = vshNodeGetCPUCount(ctl->conn)) < 0)
>          goto cleanup;
>  
> -    if (!(cpumap = vshParseCPUList(&cpumaplen, cpulist, maxcpu)))
> +    if ((vshCommandOptString(cmd, "cpulist", &cpulist) < 0) ||
> +        !(cpumap = vshParseCPUList(&cpumaplen, cpulist, maxcpu))) {
> +        vshError(ctl, "%s", _("iothreadpin: invalid cpulist."));

This one does not print the wrong string.

Jan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150506/9d7712e4/attachment-0001.sig>


More information about the libvir-list mailing list