[et-mgmt-tools] [PATCH] workarounds and fixes for new gtk-vnc integration in console.py

Bernhard Kaindl bk at suse.de
Fri Aug 31 17:57:17 UTC 2007


On Fri, 31 Aug 2007, Bernhard Kaindl wrote:
>
> Note: The message which was displayed when the gtk-vnc widget got the
> ECONNREFUSED (Connection refused) error when connecting to <hostname>:5900
> sounds a bit misleading to me.
>
> socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
> connect(4, {sa_family=AF_INET, sin_port=htons(5900), sin_addr=inet_addr("<my 
> host's LAN IP address here>")}, 16) = -1 ECONNREFUSED (Connection refused)
>
> The message resulting from this was:
>
> "Console was disconnected from guest"

Another message like this still apppeared when starting a new QEMU / KVM guest
from virt-manager, and the changes which I did in that regard to fix this
are found in the cumulated patch below.

I added some comments, so I also attached it as a MIME attachment:

--- virt-manager--devel/src/virtManager/console.py	2007/08/30 23:11:35	1.1
+++ virt-manager--devel/src/virtManager/console.py	2007/08/31 00:53:58
@@ -74,8 +74,9 @@
          self.window.get_widget("console-pages").append_page(self.vncViewer)
          self.vncViewer.realize()
          self.vncViewer.show()
-        self.vncViewerFailures = 0
+        self.vncViewerRetriesScheduled = 0
# Simple rename to be more exact to what I'm using it now.
          self.vncViewerRetryDelay = 125
+        self.connected = 0
# New: to keep track if connected or not (stop retries when connected)

          self.notifyID = None
          try:
@@ -231,44 +232,61 @@
             return 1
          return 0

+    def view_vm_status(self):
+        status = self.vm.status()
+        if status == libvirt.VIR_DOMAIN_SHUTOFF:
+            self.activate_unavailable_page(_("Guest not running"))
+        else:
+            if status == libvirt.VIR_DOMAIN_CRASHED:
+                self.activate_unavailable_page(_("Guest has crashed"))
# Helper for displaying more accurate status
+
      def _vnc_disconnected(self, src):
+        self.connected = 0
          logging.debug("VNC disconnected")
-        self.vncViewerFailures = self.vncViewerFailures + 1
-        self.activate_unavailable_page(_("Console was disconnected from guest"))
# separately moved away to other places, see futher and it becomes clear
          if not self.is_visible():
              return

-        if self.vncViewerFailures < 10:
-            self.schedule_retry()
-        else:
-            logging.error("Too many connection failures, not retrying again")
+        if self.vm.status() in [ libvirt.VIR_DOMAIN_SHUTOFF, libvirt.VIR_DOMAIN_CRASHED ]:
+            self.view_vm_status()
+            return
# Well, there is no point in scheduling login retries to the gues when it is down
# make use of self.view_vm_status() to view more explicit status information
+
+        self.activate_unavailable_page(_("TCP/IP error: VNC connection to hypervisor host got refused or disconnected!"))
# Updated version of "Console was disconnected from guest" until gtk-vnc supports the signal vnc-connection-refused
+        self.schedule_retry()
# retry couting moved to schedule_retry, so no counting done here (and elsewhere)

      def _vnc_initialized(self, src):
+        self.connected = 1
          logging.debug("VNC initialized")
          self.activate_viewer_page()

          # Had a succesfull connect, so reset counters now
-        self.vncViewerFailures = 0
+        self.vncViewerRetriesScheduled = 0
# Simple rename to be more exact to what I'm using it now.
          self.vncViewerRetryDelay = 125

      def schedule_retry(self):
+        self.vncViewerRetriesScheduled = self.vncViewerRetriesScheduled + 1
+        if self.vncViewerRetriesScheduled >= 10:
+            logging.error("Too many connection failures, not retrying again")
+            return
# retry couting moved to schedule_retry, retriy counting for all users of this function
          logging.warn("Retrying connection in %d ms", self.vncViewerRetryDelay)
          gobject.timeout_add(self.vncViewerRetryDelay, self.retry_login)
          if self.vncViewerRetryDelay < 2000:
              self.vncViewerRetryDelay = self.vncViewerRetryDelay * 2

      def retry_login(self):
+        if self.connected:
+            return
# retrying login if we are already logged in results in strange errors
          gtk.gdk.threads_enter()
          try:
              logging.debug("Got timed retry")
              self.try_login()
-            return False
+            return
# return code not used AFAICS, can as well just return without status
          finally:
              gtk.gdk.threads_leave()

      def try_login(self, src=None):
          if self.vm.get_id() < 0:
-            self.activate_unavailable_page(_("Console not available for inactive guest"))
# self.vm.get_id() < 0 means that the guest is not running, but "Console not available for inactive guest"
# reads like a error meesage so make it more simple:
+            self.activate_unavailable_page(_("Guest not running"))
# and schedule a retry in case the guest was just started but takes ~300ms to start in case of QEMU/KVM:
+            self.schedule_retry()
              return

          logging.debug("Trying console login")
@@ -320,7 +338,7 @@
                  self.vncViewer.set_credential(credList[i], "libvirt")
              else:
                  # Force it to stop re-trying
-                self.vncViewerFailures = 10
+                self.vncViewerRetriesScheduled = 10
# Simple rename to be more exact to what I'm using it now.
                  self.vncViewer.close()
                  self.activate_unavailable_page(_("Unsupported console authentication type"))

@@ -503,7 +521,7 @@
              if self.window.get_widget("console-pages").get_current_page() != PAGE_UNAVAILABLE:
                  self.vncViewer.close()
                  self.window.get_widget("console-pages").set_current_page(PAGE_UNAVAILABLE)
-            self.activate_unavailable_page(_("Console not available for inactive guest"))
+            self.view_vm_status()
# display more exact message
          else:
              if status == libvirt.VIR_DOMAIN_PAUSED:
                  if self.window.get_widget("console-pages").get_current_page() == PAGE_VNCVIEWER:
@@ -543,7 +561,7 @@
                      if self.vncViewer.is_open():
                          self.activate_viewer_page()
                      else:
-                        self.vncViewerFailures = 0
+                        self.vncViewerRetriesScheduled = 0
# Simple rename to be more exact to what I'm using it now.
                          self.vncViewerRetryDelay = 125
                          self.try_login()
                          self.ignorePause = False

Without this patch, a the console of a newly started KVM / QEMU guest is only shown after
toggling pause if the console window was open while starting it, and also some intermittent
messages which could cause unneccesary confusion are displayed. I can split it up, but
it should be rather clear what it does.

Bernhard
-------------- next part --------------
A non-text attachment was scrubbed...
Name: virt-manager-0.5.0-gtkvnc-fixes.diff
Type: text/x-patch
Size: 4615 bytes
Desc: 
URL: <http://listman.redhat.com/archives/et-mgmt-tools/attachments/20070831/33d04ead/attachment.bin>


More information about the et-mgmt-tools mailing list