13.09.2021 18:19, 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.

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()'

My personal opinion, is that this warning doesn't hurt in general. I think in 
production tools should gracefully shutdown any connection, and abrupt shutdown 
is a sign of something wrong - i.e., worth warning.

Shouldn't nbdsh do graceful shutdown by default?


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) {

Both nbd_handle_request() and nbd_send_generic_reply() declares that they 
return -errno on failure in communication with client. I think, you should use 
ret here: if (ret != -EPIPE). It's safer: who knows, does errno really set on 
all error paths of called functions? If not, we may see here errno of some 
another previous operation.

+            error_prepend(&local_err, "Failed to send reply: ");
+        } else {
+            error_free(local_err);
+            local_err = NULL;
+        }
          goto disconnect;
      }


--
Best regards,
Vladimir

Reply via email to