[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