Re: [RFC PATCH] virt-manager: console disconnected after rebooting virtual machine in Xen mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/13/21 3:30 PM, Charles Arnold wrote:
> Running with virt-manager 3.2.0, not a problem in 2.2.1.
> 
> When rebooting an HVM guest on Xen, virt-manager gets a disconnected
> event which closes the viewer. See
> self._viewer.connect("disconnected", self._viewer_disconnected).
> Running on KVM, this event does not seem to occur on VM reboot.
> 
> Both Xen and KVM get a state changed event,
> self.vm.connect("state-changed", self._vm_state_changed_cb)
> but for Xen, the viewer is gone due to the prior disconnect and when
> calling into _activate_default_console_page(), the viewer does not
> exist nor does it get created.
> The VM comes up fine but you need to close the console window and
> open it again to see the running VM.
> 
> This patch resolves the issue for me.
> 
> diff --git a/virtManager/details/console.py
> b/virtManager/details/console.py
> index fafb7202..f8a005ee 100644
> --- a/virtManager/details/console.py
> +++ b/virtManager/details/console.py
> @@ -913,6 +913,8 @@ class vmmConsolePages(vmmGObjectUI):
>              return
> 
>          cpage = self.widget("console-pages").get_current_page()
> +        if cpage == _CONSOLE_PAGE_GRAPHICS:
> +            self._init_viewer()
>          if cpage != _CONSOLE_PAGE_UNAVAILABLE:
>              return
> 
> 

Sorry for the long delayed response. Thanks for analyzing this. I think
I've seen some similar presenting issue with qemu but it's been hard to
reproduce.

The flow in console.py is confusing despite my previous cleanup
attempts. There's two error pages: _CONSOLE_PAGE_GRAPHICS with subpage
_GFX_PAGE_UNAVAILABLE, and _CONSOLE_PAGE_UNAVAILABLE

The former is meant to be for fatal connection errors, which should
block simple attempts to reconnect. So the error is preserved on screen
unless the dialog is closed+reopened. Otherwise an error may come in but
quickly get wiped out by a VM XML change event, which would attempt to
reconnect to the VM, possibly asking for auth, etc.

_CONSOLE_PAGE_UNAVAILABLE is lighter weight. This is the 'guest not
running' screen, and a few others. If the VM is running and a state
change event comes in, and we are on this page, we attempt to connect to
the viewer (like when you click 'run' on an open details window).

Unfortunately your patch makes the two cases act identical, which we
don't want for the current code IMO

The issue in this case is that viewer-disconnected is overloaded, since
it can trigger for error conditions (like ssh tunnel problems), or for
normal disconnects like this reboot case. The former should block
console reconnection, the latter shouldn't since we have no useful error
feedback to report.

Can you try this patch and see if it fixes your case?

diff --git a/virtManager/details/console.py b/virtManager/details/console.py
index fafb7202..9b1e5db5 100644
--- a/virtManager/details/console.py
+++ b/virtManager/details/console.py
@@ -814,14 +814,23 @@ class vmmConsolePages(vmmGObjectUI):
             return

         msg = _("Viewer was disconnected.")
+        errmsg = ""
         if errdetails:
-            msg += "\n" + errdetails
+            errmsg += "\n" + errdetails
         if ssherr:
             log.debug("SSH tunnel error output: %s", ssherr)
-            msg += "\n\n"
-            msg += _("SSH tunnel error output: %s") % ssherr
+            errmsg += "\n\n"
+            errmsg += _("SSH tunnel error output: %s") % ssherr

-        self._activate_gfx_unavailable_page(msg)
+        if errmsg:
+            self._activate_gfx_unavailable_page(msg + errmsg)
+            return
+
+        # If no error message was reported, this isn't a clear graphics
+        # error that should block reconnecting. So use the top level
+        # 'VM unavailable' page which makes it easier for the user to
+        # reconnect.
+        self._activate_vm_unavailable_page(msg)

     def _viewer_disconnected(self, ignore, errdetails, ssherr):
         self._activate_gfx_unavailable_page(_("Viewer disconnected."))



Thanks,
Cole




[Index of Archives]     [Linux Virtualization]     [KVM Development]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux