[Libguestfs] [PATCH libnbd] lib/poll.c: Retry poll after EINTR

Richard W.M. Jones rjones at redhat.com
Sat Oct 23 10:10:08 UTC 2021


On Sat, Oct 23, 2021 at 01:25:21AM +0300, Nir Soffer wrote:
> I see a rare random failure when calling BlockStatus via Go binding:
> 
>     block_status: nbd_block_status: poll: Interrupted system call
> 
> I could not reproduce this with "nbdinfo --map", even after modifying it
> to call nbd_block_status() for every 128 MiB.
> 
> Fixing this in nbd_unlock_poll() avoids this issue in the entire
> library, when we wait for command completion. This seems more useful
> that fixing it in all libnbd clients.
> 
> Tested using a go client listing all extents in an image, calling
> BlockStatus for every 128m with fedora 34 qcow2 image. Without this fix,
> this was always failing.
> 
> $ hyperfine -r1000 --show-output "./client nbd+unix://?socket=/tmp/nbd.sock > /dev/null"
> Benchmark 1: ./client nbd+unix://?socket=/tmp/nbd.sock > /dev/null
>   Time (mean ± σ):      31.6 ms ±   3.1 ms    [User: 8.8 ms, System: 7.2 ms]
>   Range (min … max):    26.1 ms …  52.3 ms    1000 runs
> 
> Signed-off-by: Nir Soffer <nsoffer at redhat.com>
> ---
>  lib/poll.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/poll.c b/lib/poll.c
> index edfcc59..df01d94 100644
> --- a/lib/poll.c
> +++ b/lib/poll.c
> @@ -57,8 +57,11 @@ nbd_unlocked_poll (struct nbd_handle *h, int timeout)
>     * would allow other threads to close file descriptors which we have
>     * passed to poll.
>     */
> -  r = poll (fds, 1, timeout);
> -  debug (h, "poll end: r=%d revents=%x", r, fds[0].revents);
> +  do {
> +    r = poll (fds, 1, timeout);
> +    debug (h, "poll end: r=%d revents=%x", r, fds[0].revents);
> +  } while (r == -1 && errno == EINTR);
> +
>    if (r == -1) {
>      set_error (errno, "poll");
>      return -1;

I think this is a perfectly reasonable solution, and better than
modifying the language bindings.  I guess Eric should have the final
word here, but from my point of view ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html




More information about the Libguestfs mailing list