[libvirt] [PATCH sandbox 4/4] Don't close immediately when getting EOF on RPC console

Cedric Bosdonnat cbosdonnat at suse.com
Mon Sep 7 11:56:51 UTC 2015


On Fri, 2015-09-04 at 12:40 +0100, Daniel P. Berrange wrote:
> The RPC console is closed when the libvirt-sandbox-init-common
> binary reports the exit of the guest process. We still have
> some cleanup code that runs in the guest, for example, syncing
> and ummounting filesystems. We want to be able to see debug
> and/or error messages from this code, so we should not quit
> until we get a close on that console. This should happen a
> few ms after the close on the RPC console, but just in case
> something causes shutdown to hang, we have a delayed timer
> registered.
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  bin/virt-sandbox.c | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/bin/virt-sandbox.c b/bin/virt-sandbox.c
> index 195515f..332e53e 100644
> --- a/bin/virt-sandbox.c
> +++ b/bin/virt-sandbox.c
> @@ -34,6 +34,22 @@ static gboolean do_close(GVirSandboxConsole *con G_GNUC_UNUSED,
>      return FALSE;
>  }
>  
> +static gboolean do_delayed_close(gpointer opaque)
> +{
> +    GMainLoop *loop = opaque;
> +    g_main_loop_quit(loop);
> +    return FALSE;
> +}
> +
> +static gboolean do_pending_close(GVirSandboxConsole *con G_GNUC_UNUSED,
> +                                 gboolean error G_GNUC_UNUSED,
> +                                 gpointer opaque)
> +{
> +    GMainLoop *loop = opaque;
> +    g_timeout_add(2000, do_delayed_close, loop);
> +    return FALSE;
> +}
> +
>  static gboolean do_exited(GVirSandboxConsole *con G_GNUC_UNUSED,
>                            int status,
>                            gpointer opaque)
> @@ -256,7 +272,12 @@ int main(int argc, char **argv) {
>                     error && error->message ? error->message : _("Unknown failure"));
>          goto cleanup;
>      }
> -    g_signal_connect(con, "closed", (GCallback)do_close, loop);
> +    /* We don't close right away - we want to ensure we read any
> +     * final debug info from the log console. We should get an
> +     * EOF on that console which will trigger the real close,
> +     * but we schedule a timer just in case.
> +     */
> +    g_signal_connect(con, "closed", (GCallback)do_pending_close, loop);
>      g_signal_connect(con, "exited", (GCallback)do_exited, &ret);
>  
>      if (!(gvir_sandbox_console_attach_stdio(con, &error))) {

ACK

--
Cedric





More information about the libvir-list mailing list