On Fri, Sep 22, 2023 at 12:33:36PM -0500, Eric Blake wrote:
> There are a number of ways in which gathering information can fail.
> But when possible, it makes sense to let the server know that we are
> done talking, as it minimizes the likelihood that nbdinfo's error
> message will be obscured by an accompanying error message by the
> server complaining about an unclean disconnect.
> 
> For example, with a one-off qemu temporarily patched as mentioned in
> commit 0f8ee8c6 to advertise sizes larger than 2^63, kicking off
> 'qemu-nbd -f raw -r file &' produces:
> 
> pre-patch:
> 
> $ ./run nbdinfo --size nbd://localhost
> /home/eblake/libnbd/info/.libs/nbdinfo: nbd_get_size: server claims size 
> 9223372036854781440 which does not fit in signed result: Value too large for 
> defined data type
> qemu-nbd: option negotiation failed: Failed to read opts magic: Unexpected 
> end-of-file before all data were read

This doesn't necessarily seem like a bug?

This feels like quite a significant change in behaviour to me.  In
particular I'm worried if it interacts in some subtle way with the
forking done by the "[ ... ]" syntax for running servers on the
command line (or any of the other ways that libnbd might fork/exec).

Can we hold this patch until after 1.18 is released and then put it
in?  Should only be a week or two.

Provisionally ACKed for post-1.18

Rich.

> post-patch:
> $ ./run nbdinfo --size nbd://localhost
> /home/eblake/libnbd/info/.libs/nbdinfo: nbd_get_size: server claims size 
> 9223372036854781440 which does not fit in signed result: Value too large for 
> defined data type
> 
> if nbdinfo is run in the same terminal as qemu-nbd.
> 
> Signed-off-by: Eric Blake <ebl...@redhat.com>
> ---
>  info/main.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/info/main.c b/info/main.c
> index c8248c61..05f19f43 100644
> --- a/info/main.c
> +++ b/info/main.c
> @@ -88,6 +88,17 @@ usage (FILE *fp, int exitcode)
>    exit (exitcode);
>  }
> 
> +void
> +clean_shutdown (void)
> +{
> +  /* If we are connected but detect an error, try to give the server
> +   * notice that we are done talking.  Ignore failures, as this is
> +   * only a courtesy measure.
> +   */
> +  if (nbd)
> +    nbd_shutdown (nbd, 0);
> +}
> +
>  int
>  main (int argc, char *argv[])
>  {
> @@ -277,6 +288,7 @@ main (int argc, char *argv[])
>      fprintf (stderr, "%s: %s\n", progname, nbd_get_error ());
>      exit (EXIT_FAILURE);
>    }
> +  atexit (clean_shutdown);
>    nbd_set_uri_allow_local_file (nbd, true); /* Allow ?tls-psk-file. */
> 
>    /* Set optional modes in the handle. */
> @@ -353,6 +365,7 @@ main (int argc, char *argv[])
>    free_exports ();
>    nbd_shutdown (nbd, 0);
>    nbd_close (nbd);
> +  nbd = NULL;
> 
>    /* Close the output stream and copy it to the real stdout. */
>    if (fclose (fp) == EOF) {
> -- 
> 2.41.0
> 



-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to