From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O9IjG-0000iM-Hr for qemu-devel@nongnu.org; Tue, 04 May 2010 10:04:06 -0400 Received: from [140.186.70.92] (port=38090 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O9IjA-0000eS-Kv for qemu-devel@nongnu.org; Tue, 04 May 2010 10:04:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O9Ij1-0006i8-Pu for qemu-devel@nongnu.org; Tue, 04 May 2010 10:03:54 -0400 Received: from mail-pw0-f45.google.com ([209.85.160.45]:34151) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O9Ij1-0006hu-He for qemu-devel@nongnu.org; Tue, 04 May 2010 10:03:51 -0400 Received: by pwi6 with SMTP id 6so1748659pwi.4 for ; Tue, 04 May 2010 07:03:50 -0700 (PDT) Message-ID: <4BE02943.2010304@codemonkey.ws> Date: Tue, 04 May 2010 09:03:47 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 1/2] qemu-error: Introduce get_errno_name() References: <1272486729-14771-1-git-send-email-lcapitulino@redhat.com> <1272486729-14771-2-git-send-email-lcapitulino@redhat.com> <4BDECCB3.9000601@codemonkey.ws> <20100504105645.12e34117@redhat.com> In-Reply-To: <20100504105645.12e34117@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Luiz Capitulino Cc: Markus Armbruster , qemu-devel@nongnu.org On 05/04/2010 08:56 AM, Luiz Capitulino wrote: > On Mon, 03 May 2010 08:16:35 -0500 > Anthony Liguori wrote: > > >> On 05/03/2010 08:06 AM, Markus Armbruster wrote: >> >>> Luiz Capitulino writes: >>> >>> >>> >>>> We need to expose errno in QMP, for three reasons: >>>> >>>> 1. Some error handling functions print errno codes to the user, >>>> while it's debatable whether this is good or not from a user >>>> perspective, sometimes it's the best we can do because it's >>>> what system calls and libraries return >>>> >>>> 2. Some events (eg. BLOCK_IO_ERROR) will be made even more >>>> complete with errno information >>>> >>>> 3. It's very good for debugging >>>> >>>> So, we need a way to expose those codes in QMP. We can't just use >>>> the codes themselfs because they may vary between systems. >>>> >>>> The best solution I can think of is to return the string >>>> representation of the name. For example, EIO becomes "EIO". >>>> >>>> This is what get_errno_name() does. >>>> >>>> Signed-off-by: Luiz Capitulino >>>> --- >>>> qemu-error.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> qemu-error.h | 1 + >>>> 2 files changed, 86 insertions(+), 0 deletions(-) >>>> >>>> diff --git a/qemu-error.c b/qemu-error.c >>>> index 5a35e7c..7035417 100644 >>>> --- a/qemu-error.c >>>> +++ b/qemu-error.c >>>> @@ -207,3 +207,88 @@ void error_report(const char *fmt, ...) >>>> va_end(ap); >>>> error_printf("\n"); >>>> } >>>> + >>>> +/* >>>> + * Probably only useful for QMP >>>> + */ >>>> +const char *get_errno_name(int err) >>>> +{ >>>> + switch (abs(err)) { >>>> + case EPERM: >>>> + return "EPERM"; >>>> + case ENOENT: >>>> + return "ENOENT"; >>>> >>>> >>> [...] >>> >>> >>>> + case EDOM: >>>> + return "EDOM"; >>>> + case ERANGE: >>>> + return "ERANGE"; >>>> + case ENOMEDIUM: >>>> + return "ENOMEDIUM"; >>>> + case ENOTSUP: >>>> + return "ENOTSUP"; >>>> + default: >>>> + return "unknown"; >>>> >>>> >>> How did you choose the codes to implement? POSIX has many more... >>> > I just ran an awk script on the linux's base errno header file, my > idea is just to have the common names, anything 'new' will hit the > default clause and we can add it later. > > >> Let me say another way why I think this is a bad path to go down. >> >> In generally, we could never just pass errno through down. Different >> host platforms are going to generate different errno values so we really >> need to filter and send reliable errno values so that clients don't have >> to have special code for when they're on Linux vs. AIX vs. Solaris. >> > Sorry for the potential stupid question, but what would a 'reliable' > errno be? Or, what's an unreliable errno? > > We're not sending plain integers to the clients, so the only problem > I can see is if different unices return different errnos for the > same error. Is that the problem you're seeing? > Different types of platforms return different errno values for the same error type. As an example, on Linux, connect() returns EINPROGRESS when you set the socket non-blocking. On Windows, it returns EWOULDBLOCK. If you just pass through errno, then all QMP clients are going to have to know the different between QEMU on Windows and Linux and handle the errnos appropriately. >> If we're white listing errno values, we should be able to trivially >> convert errnos to QError types via a table just like you have above. >> > Having a direct errno -> QError mapping doesn't seem good for the > current use cases. > > For example, do_savevm() (not merged yet) has a StateVmSaveFailed > error which also has a 'reason' member, which would look like this > on the wire: > > "{ 'class': 'StateVmSaveFailed', 'data': { 'reason': "EIO" } }" > > So, the QError class says what has failed and the errno part says > why it has failed. > > I'd be happy to implement a different solution that satisfies this > basic requirement. > We need to map errnos to some QMP defined error type. However, as I've said before, "reason" is usually an indicator that an error is bad. A better error would be: { 'class': 'SocketIOError': 'data' : { 'source': 'migration' }} Or something like that. You don't want to have command and then CommandFailed as the error. You want the errors to be the 'reason's for the commands failure. Regards, Anthony Liguori