[Libguestfs] [libnbd PATCH 1/6] api: Add nbd_aio_in_flight
Eric Blake
eblake at redhat.com
Thu Jul 18 13:47:06 UTC 2019
On 6/29/19 8:28 AM, Eric Blake wrote:
> Some clients need to know when it is safe to issue NBD_CMD_DISC, or to
> decide whether calling poll(POLLIN) will block indefinitely because
> the server isn't expected to respond. Make this easier to learn by
> tracking the count of commands we have queued up to send, as well as
> the count of commands where we are waiting on the server's response.
>
> Update tests/aio-parallel* and examples/batched-read-write to use
> nbd's own in-flight counter instead of reimplementing it ourselves.
>
> Note that h->in_flight is only ever updated while the lock is held;
> but we may want to consider also making it atomic and therefore
> readable as a lock-less function.
> ---
> +++ b/lib/aio.c
> @@ -23,6 +23,7 @@
> #include <stdbool.h>
> #include <errno.h>
> #include <inttypes.h>
> +#include <assert.h>
>
> #include "internal.h"
>
> @@ -84,6 +85,8 @@ nbd_unlocked_aio_command_completed (struct nbd_handle *h,
> prev_cmd->next = cmd->next;
> else
> h->cmds_done = cmd->next;
> + h->in_flight--;
> + assert (h->in_flight >= 0);
We guard against underflow...
> +++ b/lib/rw.c
> @@ -236,6 +241,7 @@ nbd_internal_command_common (struct nbd_handle *h,
nbd_internal_run (h, cmd_issue) == -1)
> return -1;
> }
>
> + h->in_flight++;
...but even though we inserted in the list, we fail to increment if
nbd_internal_run() encountered an error. Also, the count is too low if
the server managed to get a reply to us without us blocking. Obvious fix
pushed.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20190718/ae2c6399/attachment.sig>
More information about the Libguestfs
mailing list