[Libguestfs] [nbdkit PATCH 3/3] server: Add and use nbdkit_nanosleep

Eric Blake eblake at redhat.com
Mon Aug 5 22:16:57 UTC 2019


On 8/3/19 11:01 AM, Eric Blake wrote:
> There are a couple of problems with filters trying to sleep. First,
> when it is time to shut down nbdkit, we wait until all pending
> transactions have had a chance to wind down.  But consider what
> happens if one or more of those pending transactions are blocked in a
> sleep.  POSIX says nanosleep is interrupted with EINTR if that thread
> handles a signal, but wiring up signal masks just to ensure a specific
> thread will get the signal is not pretty, and that means the thread
> processing SIGINT is NOT the thread blocked in nanosleep.  Couple that
> with the fact that if multiple threads are sleeping, only one thread
> needs to process the signal, so the rest continue to sleep.  Thus,
> even though we know the user wants nbdkit to quit, we are blocked
> waiting for a potentially long sleep to complete.  This problem can be
> solved by realizing we already have a pipe-to-self to learn about a
> quit request or the end of a particular connection, and check for
> activities on those pipes in parallel with a timeout through pselect
> or ppoll to break our wait as soon as we know there is no reason to
> continue on with the transaction.
> 

> +++ b/server/public.c

> +#else
> +  struct timespec ts;
> +  struct connection *conn = threadlocal_get_conn ();
> +  struct pollfd fds[2] = {
> +    [0].fd = quit_fd,
> +    [0].events = POLLIN,
> +    [1].fd = conn ? conn->status_pipe[0] : -1,
> +    [1].events = POLLIN,

In testing this, the code is responsive to a multi-threaded connection
detecting client death on any other thread, but not responsive to a
single-threaded connection detecting client death on the lone thread.
But even with a multi-threaded connection, if every single thread is
tied up in a sleep, we lose responsiveness.  So I'm currently testing an
amendment to this patch that uses fds[3], with conn->sockout being
polled with .events = 0 for POLLHUP/POLLERR.

-- 
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/20190805/0ce29107/attachment.sig>


More information about the Libguestfs mailing list