python/machine.py: Prohibit multiple shutdown() calls
If the VM is not launched, don't try to shut it down. As a change, _post_shutdown now unconditionally also calls _early_cleanup in order to offer comprehensive object cleanup in failure cases. As a courtesy, treat it as a NOP instead of rejecting it as an error. This is slightly nicer for acceptance tests where vm.shutdown() is issued unconditionally in tearDown callbacks. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200710050649.32434-6-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
		
				
					committed by
					
						
						Philippe Mathieu-Daudé
					
				
			
			
				
	
			
			
			
						parent
						
							3a7d64b6fc
						
					
				
				
					commit
					a3842cb078
				
			@@ -294,6 +294,13 @@ class QEMUMachine:
 | 
			
		||||
            self._qmp.accept()
 | 
			
		||||
 | 
			
		||||
    def _post_shutdown(self):
 | 
			
		||||
        """
 | 
			
		||||
        Called to cleanup the VM instance after the process has exited.
 | 
			
		||||
        May also be called after a failed launch.
 | 
			
		||||
        """
 | 
			
		||||
        # Comprehensive reset for the failed launch case:
 | 
			
		||||
        self._early_cleanup()
 | 
			
		||||
 | 
			
		||||
        if self._qmp:
 | 
			
		||||
            self._qmp.close()
 | 
			
		||||
            self._qmp = None
 | 
			
		||||
@@ -339,7 +346,7 @@ class QEMUMachine:
 | 
			
		||||
            self._launch()
 | 
			
		||||
            self._launched = True
 | 
			
		||||
        except:
 | 
			
		||||
            self.shutdown()
 | 
			
		||||
            self._post_shutdown()
 | 
			
		||||
 | 
			
		||||
            LOG.debug('Error launching VM')
 | 
			
		||||
            if self._qemu_full_args:
 | 
			
		||||
@@ -368,6 +375,8 @@ class QEMUMachine:
 | 
			
		||||
    def _early_cleanup(self) -> None:
 | 
			
		||||
        """
 | 
			
		||||
        Perform any cleanup that needs to happen before the VM exits.
 | 
			
		||||
 | 
			
		||||
        Called additionally by _post_shutdown for comprehensive cleanup.
 | 
			
		||||
        """
 | 
			
		||||
        # If we keep the console socket open, we may deadlock waiting
 | 
			
		||||
        # for QEMU to exit, while QEMU is waiting for the socket to
 | 
			
		||||
@@ -388,6 +397,9 @@ class QEMUMachine:
 | 
			
		||||
        """
 | 
			
		||||
        Terminate the VM and clean up
 | 
			
		||||
        """
 | 
			
		||||
        if not self._launched:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        self._early_cleanup()
 | 
			
		||||
 | 
			
		||||
        if self.is_running():
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user