[libvirt] [PATCH] qemu_process: Read errors from child

Michal Privoznik mprivozn at redhat.com
Wed Dec 4 10:30:53 UTC 2013


On 03.12.2013 19:17, Eric Blake wrote:
> On 12/03/2013 10:52 AM, Michal Privoznik wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1035955
>>
>> There's a window when starting a qemu process between fork() and exec()
>> during which we are doing things that may fail but not tunnelling the
>> error to the daemon. This is basically all within qemuProcessHook().
> 
> Or more precisely, where things fail so early that the child decided not
> to exec() a qemu process in the first place.
> 
>> So whenever we fail in something, e.g. placing a process onto numa node,
>> users ale left with:
> 
> s/ale/are/
> 
>>
>>     error: Child quit during startup handshake: Input/output error
>>
>> while the original error is thrown into the domain log:
>>
>>     libvirt:  error : internal error: NUMA memory tuning in 'preferred'
>>     mode only supports single node
>>
>> Hence, we should read the log file and search for the error message and
>> report it to users.
> 
> An alternative might be to use a pipe back to the parent, marked
> close-on-exec, where we dump any untranslated error messages (the parent
> can then read until EOF, and if it gets anything on the pipe, then we
> know the child raised an error).  Doing so is probably a good idea
> anyways, as printing into the log file in the child process is dangerous
> (if the child uses _("...") to translate an error message, then it is
> calling a function that is not async-signal-safe, and could deadlock).
> But it's more invasive, and is not written, so your approach is find to
> use in the meantime.

Does this mean ACK with grammar fixed? :)

> 
>>  /*
>> + * Read domain log and probably overwrite error if there's one in
>> + * the domain log file. This functions exists to cover the small
> 
> s/functions/function/
> 
>> + * window between fork() and exec() during which child may fail
>> + * by libvirt hand, e.g. placing onto a NUMA node failed.
> 
> s/libvirt/libvirt's/
> 
>> +    if (off > 0) {
>> +        /* Found an error in the log. Report it */
>> +        virResetLastError();
>> +        virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                       _("Process exited prior exec: %s"),
> 
> s/prior/prior to/
> 
> 

Michal




More information about the libvir-list mailing list