[Libguestfs] [PATCH nbdkit 8/9] nbd: Fix shared=true so it creates background thread after fork.
Eric Blake
eblake at redhat.com
Mon Jul 6 19:39:11 UTC 2020
On 7/1/20 2:17 AM, Richard W.M. Jones wrote:
> This option didn't work except when using --foreground (or using
> another option that implies this). This is because it creates a
> background reader thread, but that thread is invalidated if nbdkit
> forks, resulting in deadlocks because the worker threads are
> fruitlessly sending notifications to a background thread that no
> longer exists.
>
> The fix is to move this work to .after_fork.
> ---
> plugins/nbd/nbd.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
Good catch.
>
> diff --git a/plugins/nbd/nbd.c b/plugins/nbd/nbd.c
> index 05f78777..91ed91e0 100644
> --- a/plugins/nbd/nbd.c
> +++ b/plugins/nbd/nbd.c
> @@ -109,7 +109,7 @@ static void nbdplug_close_handle (struct handle *h);
> static void
> nbdplug_unload (void)
> {
> - if (shared)
> + if (shared && shared_handle)
> nbdplug_close_handle (shared_handle);
> free (sockname);
> free (tls_certificates);
> @@ -266,8 +266,15 @@ nbdplug_config_complete (void)
> }
> nbd_close (nbd);
> }
> + return 0;
> +}
>
> - /* Create the shared connection. */
> +/* Create the shared connection. Because this may create a background
> + * thread it must be done after we fork.
> + */
> +static int
> +nbdplug_after_fork (void)
> +{
> if (shared && (shared_handle = nbdplug_open_handle (false)) == NULL)
> return -1;
> return 0;
> @@ -858,6 +865,7 @@ static struct nbdkit_plugin plugin = {
> .config_complete = nbdplug_config_complete,
> .config_help = nbdplug_config_help,
> .magic_config_key = "uri",
> + .after_fork = nbdplug_after_fork,
> .dump_plugin = nbdplug_dump_plugin,
> .open = nbdplug_open,
> .close = nbdplug_close,
>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
More information about the Libguestfs
mailing list