On 12/16/2013 10:00 AM, Daniel P. Berrange wrote:
On Mon, Dec 16, 2013 at 09:50:30AM -0500, Cole Robinson wrote:
> On 12/16/2013 04:27 AM, Laine Stump wrote:
>> On 12/14/2013 07:15 PM, Cole Robinson wrote:
>>> On 12/11/2013 03:33 PM, Michele Paolino wrote:
>>>> In libvirt, the default error message length is 1024 bytes. This is not
>>>> enough for qemu to print long error messages such as the list of
>>>> supported ARM machine models (more than 1700 chars). This is
>>>> raised when the machine entry in the XML file is wrong, but there may
>>>> be now or in future other verbose error messages.
>>>> The above patch enables libvirt to print error messages >1024 for
qemu.
>>>>
>>>> Signed-off-by: Michele Paolino <m.paolino(a)virtualopensystems.com>
>>>> ---
>>>> src/qemu/qemu_process.c | 23 +++++++++++++++++++----
>>>> 1 file changed, 19 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>>>> index bd9546e..c2e2136 100644
>>>> --- a/src/qemu/qemu_process.c
>>>> +++ b/src/qemu/qemu_process.c
>>>> @@ -1904,10 +1904,25 @@ cleanup:
>>>> * a possible read of the fd in the monitor code doesn't
influence this
>>>> * error delivery option */
>>>> ignore_value(lseek(logfd, pos, SEEK_SET));
>>>> - qemuProcessReadLog(logfd, buf + len, buf_size - len - 1, 0,
true);
>>>> - virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> - _("process exited while connecting to
monitor: %s"),
>>>> - buf);
>>>> + len = qemuProcessReadLog(logfd, buf + len, buf_size - len - 1,
0, true);
>>>> +
>>>> + /* virReportError error buffer is limited to 1024 byte*/
>>>> + if (len < 1024){
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("process exited while connecting to
monitor: %s"),
>>>> + buf);
>>>> + } else {
>>>> + if (STRPREFIX(buf, "Supported machines are:"))
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("process exited while connecting to
monitor:"
>>>> + "please check machine model"));
>>>> + else
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("process exited while connecting to
monitor"));
>>>> +
>>>> + VIR_ERROR("%s", buf);
>>>> + }
>>>> +
>>>> ret = -1;
>>>> }
>>>>
>>>>
>>> This kind of error scraping is a slipper slop IMO, and for this particular
>>> case I don't think it's even that interesting.
>>
>> I definitely agree with that.
>>
>>>
>>> Libvirt already parses the machine types for each qemu emulator and reports
it
>>> in virsh capabilities XML. Seems reasonable that we could validate the XML
>>> machine type at define time and catch an invalid machine type error long
>>> before we even try and start the VM.
>>
>> Do we really want to refuse to define a particular guest just because
>> the host where we're defining it doesn't currently support the given
>> machine type? That's yet another slippery slope - for example, should we
>> also be validating all the devices in <hostdev> at definition time? I
>> think the proper time to do that validation is at domain start time when
>> we should have the proper qemu binary (and necessary drivers/hardware)
>> available.
>>
>
> My suggestion for define time was because IIRC that's where we do the
> capabilities arch + os type + domain type validation as well.
>
> Doing validation at that level is nice because we don't need to duplicate it
> in each driver, but it also sucks when qemu is accidentally uninstalled and
> libvirt is restarted, it now refuses to parse all those pre-existing qemu/kvm
> configs, and virsh list --all is empty to the great confusion of users.
Yeah, that is actually quite a big problem I'd like us to fix one day
by moving that validation out of the define stage into the start stage
FWIW I filed an upstream bug:
https://bugzilla.redhat.com/show_bug.cgi?id=1043572
(yeah, the upstream tracker is kinda/sorta a wasteland. But I have this vague
plan of sometime in the next six months giving it a serious cleanup, and
possibly even tagging some bugs as 'easyfix' or similar and make some noise
about intro level tasks for people interested in contributing. this bug would
be a decent fit, though don't let that stop anyone from doing it sooner).
- Cole