On Fri, Sep 25, 2026 at 05:53:45PM +0200, Guillaume Vincke wrote:
> When a server closes the connection after a successful handshake but
> before running any operations, the channel returned by
> nbd_co_establish_connection() is the closed one and the connect thread
> is not started.
> 
> When configured with reconnect-delay=0 (the default), this situation
> generates at least two IO errors. The first one happens when trying to
> issue an operation to the closed socket. The connect thread will be
> started on the next request, which may happen long after, and will
> create the second error as nbd_co_establish_connection() returns a NULL
> channel.
> 
> Peeking the channel to detect FIN or RST avoids the first IO error and
> does not delay the starting of the connect thread.
> 
> Signed-off-by: Guillaume Vincke <[email protected]>
> ---
>  nbd/client-connection.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/nbd/client-connection.c b/nbd/client-connection.c
> index 6a4f080717..878219fede 100644
> --- a/nbd/client-connection.c
> +++ b/nbd/client-connection.c
> @@ -274,6 +274,26 @@ void nbd_client_connection_release(NBDClientConnection 
> *conn)
>      }
>  }
>  
> +/* only true when the peer closed the channel. Does not detect if dead */

For consistent style, I would use

/* Only true when the peer closed the channel. Does not detect if dead. */

> +static bool nbd_channel_is_closed(QIOChannel *ioc)
> +{
> +    char data;
> +    struct iovec iov = { .iov_base = &data, .iov_len = 1 };
> +    ssize_t len = -1;
> +
> +    if (!qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_READ_MSG_PEEK)) {
> +        return false;
> +    }
> +
> +    len = qio_channel_readv_full(
> +        ioc, &iov, 1, NULL, NULL, QIO_CHANNEL_READ_FLAG_MSG_PEEK, NULL);
> +
> +    if (len == 0 || (len < 0 && len != QIO_CHANNEL_ERR_BLOCK)) {
> +        return true;
> +    }
> +    return false;

The last group could be shortened to:

   return len == 0 || (len < 0 && len != QIO_CHANNEL_ERR_BLOCK);

but that is not mandatory.

Reviewed-by: Eric Blake <[email protected]>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.
Virtualization:  qemu.org | libguestfs.org


Reply via email to