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@xxxxxxxxxx> --- 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))) { -- 2.4.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list