aboutsummaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Snow <jsnow@redhat.com>2020-07-10 01:06:42 -0400
committerPhilippe Mathieu-Daudé <philmd@redhat.com>2020-07-14 22:22:22 +0200
commita3842cb078a195db0715b00edd7812adcb8b077f (patch)
treec5cde25f1c2a6640aa6c9f6ca4f472a4194e4245 /python
parent3a7d64b6fc8ddce3987005e0ee6eadbe2cbba5c8 (diff)
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>
Diffstat (limited to 'python')
-rw-r--r--python/qemu/machine.py14
1 files changed, 13 insertions, 1 deletions
diff --git a/python/qemu/machine.py b/python/qemu/machine.py
index 63e40879e2..c28957ee82 100644
--- a/python/qemu/machine.py
+++ b/python/qemu/machine.py
@@ -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():