aboutsummaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Snow <jsnow@redhat.com>2022-10-27 14:58:35 -0400
committerJohn Snow <jsnow@redhat.com>2023-01-04 13:46:05 -0500
commit9cccb3305a26ee01fea7b3a179eca01c98083e3a (patch)
tree48fe8fb0c84a9b642a83f0c706fd3f472c8c967c /python
parentecc9a58835f8d4ea4e3ed36832032a71ee08fbb2 (diff)
downloadqemu-9cccb3305a26ee01fea7b3a179eca01c98083e3a.zip
qemu-9cccb3305a26ee01fea7b3a179eca01c98083e3a.tar.gz
qemu-9cccb3305a26ee01fea7b3a179eca01c98083e3a.tar.bz2
python/machine: Add debug logging to key state changes
When key decisions are made about the lifetime of the VM process being managed, there's no log entry. Juxtaposed with the very verbose runstate change logging of the QMP module, machine seems a bit too introverted now. Season the machine.py module with logging statements to taste to help make a tastier soup. Signed-off-by: John Snow <jsnow@redhat.com>
Diffstat (limited to 'python')
-rw-r--r--python/qemu/machine/machine.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
index 37191f4..6f1374a 100644
--- a/python/qemu/machine/machine.py
+++ b/python/qemu/machine/machine.py
@@ -373,6 +373,7 @@ class QEMUMachine:
Called to cleanup the VM instance after the process has exited.
May also be called after a failed launch.
"""
+ LOG.debug("Cleaning up after VM process")
try:
self._close_qmp_connection()
except Exception as err: # pylint: disable=broad-except
@@ -497,6 +498,7 @@ class QEMUMachine:
# for QEMU to exit, while QEMU is waiting for the socket to
# become writable.
if self._console_socket is not None:
+ LOG.debug("Closing console socket")
self._console_socket.close()
self._console_socket = None
@@ -507,6 +509,7 @@ class QEMUMachine:
:raise subprocess.Timeout: When timeout is exceeds 60 seconds
waiting for the QEMU process to terminate.
"""
+ LOG.debug("Performing hard shutdown")
self._early_cleanup()
self._subp.kill()
self._subp.wait(timeout=60)
@@ -523,8 +526,18 @@ class QEMUMachine:
:raise subprocess.TimeoutExpired: When timeout is exceeded waiting for
the QEMU process to terminate.
"""
+ LOG.debug("Attempting graceful termination")
+
self._early_cleanup()
+ if self._quit_issued:
+ LOG.debug(
+ "Anticipating QEMU termination due to prior 'quit' command, "
+ "or explicit call to wait()"
+ )
+ else:
+ LOG.debug("Politely asking QEMU to terminate")
+
if self._qmp_connection:
try:
if not self._quit_issued:
@@ -536,6 +549,10 @@ class QEMUMachine:
self._close_qmp_connection()
# May raise subprocess.TimeoutExpired
+ LOG.debug(
+ "Waiting (timeout=%s) for QEMU process (pid=%s) to terminate",
+ timeout, self._subp.pid
+ )
self._subp.wait(timeout=timeout)
def _do_shutdown(self, timeout: Optional[int]) -> None:
@@ -553,6 +570,10 @@ class QEMUMachine:
try:
self._soft_shutdown(timeout)
except Exception as exc:
+ if isinstance(exc, subprocess.TimeoutExpired):
+ LOG.debug("Timed out waiting for QEMU process to exit")
+ LOG.debug("Graceful shutdown failed", exc_info=True)
+ LOG.debug("Falling back to hard shutdown")
self._hard_shutdown()
raise AbnormalShutdown("Could not perform graceful shutdown") \
from exc
@@ -575,6 +596,10 @@ class QEMUMachine:
if not self._launched:
return
+ LOG.debug("Shutting down VM appliance; timeout=%s", timeout)
+ if hard:
+ LOG.debug("Caller requests immediate termination of QEMU process.")
+
try:
if hard:
self._user_killed = True