clan_vm_manager: Fix qmp shutdown command, bad socket error on retried shutdown
checks / check-links (pull_request) Successful in 22s Details
checks / checks-impure (pull_request) Successful in 1m55s Details
checks / checks (pull_request) Successful in 2m58s Details

This commit is contained in:
Luis Hebendanz 2024-02-26 01:18:13 +07:00
parent ea7b0c8b90
commit 183c1f4235
2 changed files with 11 additions and 16 deletions

View File

@ -25,22 +25,18 @@ class VMAttr:
# the symlink will be dangling.
self._qmp_socket: Path = state_dir / "qmp.sock"
self._qga_socket: Path = state_dir / "qga.sock"
self._qmp: QEMUMonitorProtocol | None = None
@contextmanager
def qmp_ctx(self) -> Generator[QEMUMonitorProtocol, None, None]:
if self._qmp is None:
rpath = self._qmp_socket.resolve()
if not rpath.exists():
raise ClanError(
f"qmp socket {rpath} does not exist. Is the VM running?"
)
self._qmp = QEMUMonitorProtocol(str(rpath))
self._qmp.connect()
rpath = self._qmp_socket.resolve()
if not rpath.exists():
raise ClanError(f"qmp socket {rpath} does not exist. Is the VM running?")
qmp = QEMUMonitorProtocol(str(rpath))
qmp.connect()
try:
yield self._qmp
yield qmp
finally:
self._qmp.close()
qmp.close()
class Machine:

View File

@ -286,12 +286,11 @@ class VM(GObject.Object):
try:
with self.machine.vm.qmp_ctx() as qmp:
qmp.command("system_powerdown")
except (OSError, ClanError):
# log.debug(f"QMP command 'system_powerdown' ignored. Error: {e}")
pass
except (OSError, ClanError) as ex:
log.debug(f"QMP command 'system_powerdown' ignored. Error: {ex}")
# Try 2 times a second
time.sleep(0.5)
# Try 20 times to stop the VM
time.sleep(self.KILL_TIMEOUT / 20)
GLib.idle_add(self.emit, "vm_status_changed", self)
log.debug(f"VM {self.get_id()} has stopped")