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