[libvirt] [PATCHv2 4/4] qemu: Wire up better early error reporting

John Ferlan jferlan at redhat.com
Fri Sep 27 19:50:08 UTC 2013


On 09/24/2013 11:14 AM, Peter Krempa wrote:
...

> 
>  src/qemu/qemu_process.c | 30 +++++++++++++++++++-----------
>  1 file changed, 19 insertions(+), 11 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 846cee6..2b9bfe3 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1389,7 +1389,7 @@ static qemuMonitorCallbacks monitorCallbacks = {
>  };
> 
>  static int
> -qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm)
> +qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int logfd)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      int ret = -1;
> @@ -1415,6 +1415,9 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm)
>                            &monitorCallbacks,
>                            driver);
> 
> +    if (mon)
> +        ignore_value(qemuMonitorSetDomainLog(mon, logfd));
> +
>      virObjectLock(vm);
>      priv->monStart = 0;
> 
> @@ -1794,11 +1797,11 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
>      virHashTablePtr paths = NULL;
>      qemuDomainObjPrivatePtr priv;
> 
> -    if (!virQEMUCapsUsedQMP(qemuCaps)
> -        && pos != -1) {
> -        if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0)
> -            return -1;
> +    if (pos != -1 &&
> +        (logfd = qemuDomainOpenLog(driver, vm, pos)) < 0)
> +        return -1;
> 
> +    if (logfd != -1 && !virQEMUCapsUsedQMP(qemuCaps)) {
>          if (VIR_ALLOC_N(buf, buf_size) < 0)
>              goto closelog;
> 
> @@ -1809,9 +1812,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
>      }
> 
>      VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name);
> -    if (qemuConnectMonitor(driver, vm) < 0) {
> +    if (qemuConnectMonitor(driver, vm, logfd) < 0)
>          goto cleanup;
> -    }
> 
>      /* Try to get the pty path mappings again via the monitor. This is much more
>       * reliable if it's available.
> @@ -1838,14 +1840,15 @@ cleanup:
>          /* VM is dead, any other error raised in the interim is probably
>           * not as important as the qemu cmdline output */
>          if (virQEMUCapsUsedQMP(qemuCaps)) {
> -            if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0)
> -                return -1;
> -
>              if (VIR_ALLOC_N(buf, buf_size) < 0)
>                  goto closelog;
>          }
> 
>          len = strlen(buf);
> +        /* best effor seek - we need to reset to the original position, so that
> +         * a possible read of the fd in the monitor code doesn't influence this
> +         * error delivery option */
> +        lseek(logfd, pos, SEEK_SET);

Coverity complains:
1850 	         * error delivery option */

(18) Event check_return: 	Calling function "lseek(logfd, pos, 0)" without checking return value. This library function may fail and return an error code.
(19) Event unchecked_value: 	No check of the return value of "lseek(logfd, pos, 0)".

1851 	        lseek(logfd, pos, SEEK_SET);

John

>          qemuProcessReadLog(logfd, buf + len, buf_size - len - 1, 0, true);
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("process exited while connecting to monitor: %s"),
> @@ -3080,7 +3083,7 @@ qemuProcessReconnect(void *opaque)
>      virObjectRef(obj);
> 
>      /* XXX check PID liveliness & EXE path */
> -    if (qemuConnectMonitor(driver, obj) < 0)
> +    if (qemuConnectMonitor(driver, obj, -1) < 0)
>          goto error;
> 
>      /* Failure to connect to agent shouldn't be fatal */
> @@ -4047,6 +4050,9 @@ int qemuProcessStart(virConnectPtr conn,
>              goto cleanup;
>      }
> 
> +    /* unset reporting errors from qemu log */
> +    qemuMonitorSetDomainLog(priv->mon, -1);
> +
>      virCommandFree(cmd);
>      VIR_FORCE_CLOSE(logfile);
>      virObjectUnref(cfg);
> @@ -4062,6 +4068,8 @@ cleanup:
>      virBitmapFree(nodemask);
>      virCommandFree(cmd);
>      VIR_FORCE_CLOSE(logfile);
> +    if (priv->mon)
> +        qemuMonitorSetDomainLog(priv->mon, -1);
>      qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, stop_flags);
>      virObjectUnref(cfg);
>      virObjectUnref(caps);
> 




More information about the libvir-list mailing list