[libvirt] [PATCH] qemu_domain: add timestamp in tainting of guests log

John Ferlan jferlan at redhat.com
Wed Jan 18 14:24:08 UTC 2017



On 01/16/2017 04:19 AM, Chen Hanxiao wrote:
> From: Chen Hanxiao <chenhanxiao at gmail.com>
> 
> We lacked of timestamp in tainting of guests log,
> which bring troubles for finding guest issues:
> such as whether a guest powerdown caused by qemu-monitor-command
> or others issues inside guests.
> If we had timestamp in tainting of guests log,
> it would be helpful when checking guest's logs(eg. /var/log/messages).
> 
> Signed-off-by: Chen Hanxiao <chenhanxiao at gmail.com>
> ---
>  src/qemu/qemu_domain.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 35baffb..21c90a9 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -4001,6 +4001,7 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,
>      bool closeLog = false;
>  
>      if (virDomainObjTaint(obj, taint)) {
> +        char *timestamp = NULL;
>          char uuidstr[VIR_UUID_STRING_BUFLEN];
>          virUUIDFormat(obj->def->uuid, uuidstr);
>  
> @@ -4018,27 +4019,31 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,

I think rather than the current flow:

1. Move timestamp decl to the top (because #2 is moving cleanup label)

2. Move cleanup to the bottom of the function (to be consistent w/ other
functions)

3. Move the timestamp fetch to before the LogContextNew

If you really wanted to be creative... Create a patch 1 which reverses
the virDomainObjTaint logic to be:

    if (!virDomainObjTaint(obj, taint))
        return;

Then move the subsequent lines 4 spaces to the left (e.g. reduce
indentation).


>              logCtxt = qemuDomainLogContextNew(driver, obj,
>                                                QEMU_DOMAIN_LOG_CONTEXT_MODE_ATTACH);
>              if (!logCtxt) {
> -                if (orig_err) {
> -                    virSetError(orig_err);
> -                    virFreeError(orig_err);
> -                }
>                  VIR_WARN("Unable to open domainlog");
> -                return;
> +                goto cleanup;
>              }
>              closeLog = true;
>          }
>  
> +        if ((timestamp = virTimeStringNow()) == NULL)
> +            goto cleanup;
> +
>          if (qemuDomainLogContextWrite(logCtxt,
> -                                      "Domain id=%d is tainted: %s\n",
> +                                      "%s: Domain id=%d is tainted: %s\n",
> +                                      timestamp,
>                                        obj->def->id,
>                                        virDomainTaintTypeToString(taint)) < 0)
>              virResetLastError();
> +
> +     cleanup:
>          if (closeLog)
>              qemuDomainLogContextFree(logCtxt);
>          if (orig_err) {
>              virSetError(orig_err);
>              virFreeError(orig_err);
>          }
> +
> +        VIR_FREE(timestamp);

Move this before the "closeLog" check (and the whole cleanup hunk moves
outside the if statement - just looks strange inside

>      }

The order would be:

 cleanup:
    VIR_FREE(timestamp);
    if (closeLog)
        qemuDomainLogContextFree(logCtxt);
    if (orig_err) {
        virSetError(orig_err);
        virFreeError(orig_err);
    }

John

>  }
>  
> 




More information about the libvir-list mailing list