[libvirt] [PATCH v2 04/20] virlog: Introduce virLogFindOutput

John Ferlan jferlan at redhat.com
Wed Sep 21 18:00:25 UTC 2016



On 08/18/2016 07:47 AM, Erik Skultety wrote:
> Outputs are a bit trickier than filters, because if the user(config)-specified
> set of outputs does contain duplicates. So, not only we would log twice, but

"because the user(config) specified set of outputs can contain duplicates."

> we would also leek FD for journald, since that one is global and is overwritten

s/leek/leak

Which may not be true any more if patch 19 is moved.

ACK -

John
> every time a journald output was specified. For compatibility reasons, we
> cannot just error out and forbid the daemon to start if we find duplicate
> outputs which do not make sense. Instead, we could silently take into account
> only the last occurrence of the duplicate output and remove all the previous
> ones, so that the logger will not try to use them when it is looping over all
> of its registered outputs.
> 
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virlog.c        | 32 ++++++++++++++++++++++++++++++++
>  src/util/virlog.h        |  2 ++
>  3 files changed, 35 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 088f9f3..d28405c 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1847,6 +1847,7 @@ virLogDefineOutput;
>  virLogFilterFree;
>  virLogFilterListFree;
>  virLogFilterNew;
> +virLogFindOutput;
>  virLogGetDefaultPriority;
>  virLogGetFilters;
>  virLogGetNbFilters;
> diff --git a/src/util/virlog.c b/src/util/virlog.c
> index e4dc84b..5916ac8 100644
> --- a/src/util/virlog.c
> +++ b/src/util/virlog.c
> @@ -1650,3 +1650,35 @@ virLogFilterNew(const char *match,
>  
>      return ret;
>  }
> +
> +
> +/**
> + * virLogFindOutput:
> + * @outputs: a list of outputs where to look for the output of type @dest
> + * @noutputs: number of elements in @outputs
> + * @dest: destination type of an output
> + * @opaque: opaque data to the method (only filename at the moment)
> + *
> + * Looks for an output of destination type @dest in the source list @outputs.
> + * If such an output exists, index of the object in the list is returned.
> + * In case of the destination being of type FILE also a comparison of the
> + * output's filename with @opaque is performed first.
> + *
> + * Returns the index of the object in the list or -1 if no object matching the
> + * specified @dest type and/or @opaque data one was found.
> + */
> +int
> +virLogFindOutput(virLogOutputPtr *outputs, size_t noutputs,
> +                 virLogDestination dest, const void *opaque)
> +{
> +    size_t i;
> +    const char *name = opaque;
> +
> +    for (i = 0; i < noutputs; i++) {
> +        if (dest == outputs[i]->dest &&
> +            (dest != VIR_LOG_TO_FILE || STREQ(outputs[i]->name, name)))
> +                return i;
> +    }
> +
> +    return -1;
> +}
> diff --git a/src/util/virlog.h b/src/util/virlog.h
> index a56d297..2045c06 100644
> --- a/src/util/virlog.h
> +++ b/src/util/virlog.h
> @@ -235,5 +235,7 @@ virLogOutputPtr virLogOutputNew(virLogOutputFunc f,
>  virLogFilterPtr virLogFilterNew(const char *match,
>                                  virLogPriority priority,
>                                  unsigned int flags);
> +int virLogFindOutput(virLogOutputPtr *outputs, size_t noutputs,
> +                     virLogDestination dest, const void *opaque);
>  
>  #endif
> 




More information about the libvir-list mailing list