qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-4.0] nbd: Permit simple error to NBD_CMD_BLO


From: Eric Blake
Subject: Re: [Qemu-devel] [PATCH for-4.0] nbd: Permit simple error to NBD_CMD_BLOCK_STATUS
Date: Mon, 25 Mar 2019 12:05:49 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.0

On 3/25/19 11:21 AM, Eric Blake wrote:

>>>>> -    if (!extent->length && !iter.err) {
>>>>> -        error_setg(&iter.err,
>>>>> -                   "Server did not reply with any status extents");
>>>>> +    if (!extent->length && !iter.request_ret) {
>>>>
>>>> Hmm, I don't see, what is changed. You just don't set ret and err if there 
>>>> already
>>>> set request_ret.. So, finally it may lead to other return code in 
>>>> nbd_client_co_block_status
>>>> and local_err will not be set and traced. But there is no connection close 
>>>> in this case
>>>> in current code, s->quit is not set.
>>>
>>> And that's okay. The whole point of this is that if the server replied
>>> with an error message (iter.request_ret), then it is okay that the
>>> server did not give us any extent->length, and the caller will turn
>>> iter.request_ret into the EINVAL reply (or whatever other errno value
>>> the server sent) to .bdrv_co_block_status() while keeping the connection
>>> alive.  But if the server did NOT send an error reply (iter.request_ret
>>> is 0), but also did not send us any status, then we need to turn that
>>> into an error condition (because our caller expected us to make progress
>>> on success, even though the server did not make progress).
>>
>>
>> I just say, that I don't see "the client treats the server's
>> reply as fatal and hangs up on the connection" in this place before your 
>> change.
>> Or what you mean?

Okay, maybe I'm seeing what you are asking. When I reran my testing, I
note that iter.err is left unset when iter.request_ret is set.  So my
earlier message was wrong:


> So, the full setup of things to test:
> 
> server that always fails with structured error:
>  - client before 7f86068d (qemu 3.1): connection stays alive, regardless
> of this patch
>  - client after 7f86068d: connection stays alive, regardless of this patch

The connection does not die, but this patch still matters:

- without the second half of this patch, the error given to the caller
is always EIO, regardless of what the server reported
- with the second half of this patch, the error given to the caller is
the error presented by the server. (The first half of the patch doesn't
matter).

> 
> server that always fails with simple error:
>  - client before 7f86068d: (second half of patch does not apply, so only
> the first half is needed):
>    - without first half, connection dies because "Protocol error: simple
> reply when structured reply chunk was expected"
>    - with first half, connection stays alive as it does for structured error
>  - client after 7f86068d, with various stages of this patch:
>    - without either half (or with second half only), connection dies
> because "Protocol error: simple reply when structured reply chunk was
> expected"
>    - with first half, connection dies because "server did not reply with
> any status extents"

the connection does NOT die in this case, but without the second half,
the caller gets EIO regardless of what the server passed.

>    - with both halves, connection stays alive

and here, the caller gets the server's error.

Okay, with your insistence on making me explain myself, I need to submit
a v2 of this patch, split into two pieces, and with a better commit message.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]