[virt-tools-list] [virt-viewer][PATCH] Reconnect to libvirtd after connection breaks
Christophe Fergeau
cfergeau at redhat.com
Mon Nov 12 09:57:36 UTC 2012
On Thu, Nov 08, 2012 at 05:13:09PM +0100, Michal Privoznik wrote:
> Currently, if user wants to reconnect to a domain he can use
> '-r' cmd line argument. This makes virt-viewer listen to
> domain events. However, if connection to libvirtd breaks
> somehow, we will receive no longer any event. Hence we must
> reconnect to the libvirt.
> ---
> configure.ac | 2 +-
> src/virt-viewer-app.c | 2 +
> src/virt-viewer.c | 70 ++++++++++++++++++++++++++++++++++++++++++------
> 3 files changed, 64 insertions(+), 10 deletions(-)
>
> diff --git a/src/virt-viewer.c b/src/virt-viewer.c
> index bada5a9..f661573 100644
> --- a/src/virt-viewer.c
> +++ b/src/virt-viewer.c
> @@ -136,7 +136,9 @@ virt_viewer_deactivated(VirtViewerApp *app)
> }
>
> if (priv->reconnect) {
> - if (!priv->withEvents) {
> + if (priv->withEvents) {
> +
> + } else {
> DEBUG_LOG("No domain events, falling back to polling");
> virt_viewer_app_start_reconnect_poll(app);
> }
> @@ -481,6 +483,25 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED,
> return 0;
> }
>
> +static void
> +virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED,
> + int reason,
> + void *opaque)
> +{
> + VirtViewer *self = opaque;
> + VirtViewerApp *app = VIRT_VIEWER_APP(self);
> + VirtViewerPrivate *priv = self->priv;
> +
> + DEBUG_LOG("Got connection event %d", reason);
> +
> + virConnectClose(priv->conn);
> + priv->conn = NULL;
> +
> + virt_viewer_app_start_reconnect_poll(app);
> +}
> +
> +static int virt_viewer_connect(VirtViewerApp *app);
> +
> static int
> virt_viewer_initial_connect(VirtViewerApp *app)
> {
> @@ -490,6 +511,15 @@ virt_viewer_initial_connect(VirtViewerApp *app)
> VirtViewer *self = VIRT_VIEWER(app);
> VirtViewerPrivate *priv = self->priv;
>
> +
> + DEBUG_LOG("initial connect");
> +
> + if (!priv->conn &&
> + virt_viewer_connect(app) < 0) {
> + virt_viewer_app_show_status(app, _("Waiting for libvirt to start"));
> + goto done;
> + }
> +
> virt_viewer_app_show_status(app, _("Finding guest domain"));
> dom = virt_viewer_lookup_domain(self);
> if (!dom) {
> @@ -610,9 +640,8 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred,
> return ret;
> }
>
> -
> -static gboolean
> -virt_viewer_start(VirtViewerApp *app)
> +static int
> +virt_viewer_connect(VirtViewerApp *app)
> {
> VirtViewer *self = VIRT_VIEWER(app);
> VirtViewerPrivate *priv = self->priv;
> @@ -629,9 +658,7 @@ virt_viewer_start(VirtViewerApp *app)
> if (!virt_viewer_app_get_attach(app))
> oflags |= VIR_CONNECT_RO;
>
> - virt_viewer_events_register();
> -
> - virSetErrorFunc(NULL, virt_viewer_error_func);
> + DEBUG_LOG("connecting ...");
>
> virt_viewer_app_trace(app, "Opening connection to libvirt with URI %s",
> priv->uri ? priv->uri : "<null>");
> @@ -642,11 +669,16 @@ virt_viewer_start(VirtViewerApp *app)
> if (!priv->conn) {
> virt_viewer_app_simple_message_dialog(app, _("Unable to connect to libvirt with URI %s"),
> priv->uri ? priv->uri : _("[none]"));
> - return FALSE;
> + priv->conn = NULL;
> + ;
> + ;
> + ;
> +
> + return -1;
This hunk is weird, I guess you intended just this:
- return FALSE;
+ return -1;
Looks good otherwise
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20121112/5b5d6039/attachment.sig>
More information about the virt-tools-list
mailing list