Revisiting an older thread On Mon, Sep 13, 2021 at 04:19:36PM +0100, Richard W.M. Jones wrote: > $ rm -f /tmp/sock /tmp/pid > $ qemu-img create -f qcow2 /tmp/disk.qcow2 1M > $ qemu-nbd -t --format=qcow2 --socket=/tmp/sock --pid-file=/tmp/pid > /tmp/disk.qcow2 & > $ nbdsh -u 'nbd+unix:///?socket=/tmp/sock' -c 'h.get_size()' > qemu-nbd: Disconnect client, due to: Failed to send reply: Unable to write to > socket: Broken pipe > $ killall qemu-nbd > > nbdsh is abruptly dropping the NBD connection here which is a valid > way to close the connection. It seems unnecessary to print an error > in this case so this commit suppresses it.
I've investigated this a bit further, and found that we have a regression in 6.0 when the abrupt disconnect occurs over TCP instead of Unix sockets. Prior to that point, if a client does a hard disconnect with no pending message, a 5.2 server reports: $ qemu-nbd -f raw file & [1] 1059670 $ nbdsh -u nbd://localhost:10809 -c 'h.trim(1,0)' qemu-nbd: Disconnect client, due to: Failed to read request: Unexpected end-of-file before all bytes were read [1]+ Done qemu-nbd -f raw file but in 6.0, we started reporting: qemu-nbd: Disconnect client, due to: Request handling failed in intermediate state and looking further, I discovered that if you also use --trace=nbd_\*, qemu-nbd ends up tracing uninitialized memory; it is now failing because it sees an unexpected magic number from the uninitialized memory, rather than its earlier detection of early EOF. It's interesting that a Unix socket sees EPIPE when a TCP socket does not, but it also means that your patch in isolation won't solve the TCP issue, so I'm trying to come up with something today. > > Note that if you call the nbdsh h.shutdown() method then the message > was not printed: > > $ nbdsh -u 'nbd+unix:///?socket=/tmp/sock' -c 'h.get_size()' -c 'h.shutdown()' > > Signed-off-by: Richard W.M. Jones <rjo...@redhat.com> > --- > nbd/server.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/nbd/server.c b/nbd/server.c > index 3927f7789d..e0a43802b2 100644 > --- a/nbd/server.c > +++ b/nbd/server.c > @@ -2669,7 +2669,12 @@ static coroutine_fn void nbd_trip(void *opaque) > ret = nbd_handle_request(client, &request, req->data, &local_err); > } > if (ret < 0) { > - error_prepend(&local_err, "Failed to send reply: "); > + if (errno != EPIPE) { > + error_prepend(&local_err, "Failed to send reply: "); > + } else { > + error_free(local_err); > + local_err = NULL; > + } > goto disconnect; > } > > -- > 2.32.0 > -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org