[virt-tools-list] [virt-manager][PATCH v3] Add delete VM option in console viewer.
Leonardo Augusto Guimarães Garcia
lagarcia at linux.vnet.ibm.com
Mon Jun 17 17:36:09 UTC 2013
On 06/17/2013 02:06 PM, Leonardo Garcia wrote:
> diff --git a/virtManager/console.py b/virtManager/console.py
> index b9186ce..001318e 100644
> --- a/virtManager/console.py
> +++ b/virtManager/console.py
> @@ -651,7 +651,10 @@ class vmmConsolePages(vmmGObjectUI):
> self.page_changed()
>
> def is_visible(self):
> - return self.topwin.get_visible()
> + if self.topwin:
> + return self.topwin.get_visible()
> + else:
> + return False
>
> def _cleanup(self):
> self.vm = None
> @@ -892,6 +895,9 @@ class vmmConsolePages(vmmGObjectUI):
> ##########################
>
> def view_vm_status(self):
> + if not self.vm:
> + # window has been closed and no pages to update are available.
> + return
> status = self.vm.status()
> if status == libvirt.VIR_DOMAIN_SHUTOFF:
> self.activate_unavailable_page(_("Guest not running"))
> @@ -900,7 +906,6 @@ class vmmConsolePages(vmmGObjectUI):
> self.activate_unavailable_page(_("Guest has crashed"))
>
> def close_viewer(self):
> - viewport = self.widget("console-gfx-viewport")
> if self.viewer is None:
> return
>
> @@ -908,6 +913,7 @@ class vmmConsolePages(vmmGObjectUI):
> self.viewer = None
> w = v.display
>
> + viewport = self.widget("console-gfx-viewport")
> if w and w in viewport.get_children():
> viewport.remove(w)
As I think this part of the patch proposal will rise some questions, let
me try to explain why this is needed.
Again, this is a race condition with the fact that the console viewer
will be destroyed when the running VM is deleted.
When the VM is deleted, we have: vmmEngine._do_vm_removed ->
vmmDetails.close -> vmmConsolePages.close_viewer.
However, at some point in time, a call to
SpiceViewer._main_channel_event_cb will be queued by the channel-event
signal, and this callback will be executed after the vmmDetails has
already closed the viewer. In this situation:
SpiceViewer._main_channel_event_cb -> vmmConsolePages.disconnected ->
vmmConsolePages.close_viewer
So, we need some extra code to make sure that the call to close_viewer
is successful when the viewer does not exist anymore.
I initially thought this was being caused by the fact that the
channel-event signal is being listened with connect_after and was being
handled too late. But even after using GObject.connect I was still
hitting this error. So I think the event from the spice protocol is
hitting the application after the vmmDetails has been closed.
Best regards,
Leonardo Garcia
More information about the virt-tools-list
mailing list