[virt-tools-list] [virt-manager][PATCH v3] Add delete VM option in console viewer.

Cole Robinson crobinso at redhat.com
Mon Jun 17 17:51:31 UTC 2013


On 06/17/2013 01:36 PM, Leonardo Augusto Guimarães Garcia wrote:
> 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.
> 

Thanks for the explanation, that all sounds fine to me.

- Cole




More information about the virt-tools-list mailing list