Merge pull request 'clan_vm_manager: Fix qmp shutdown command, bad socket error on retried shutdown' (#878) from Qubasa-main into main
checks / check-links (push) Successful in 21s Details
checks / checks (push) Successful in 30s Details
checks / checks-impure (push) Successful in 1m53s Details

This commit is contained in:
clan-bot 2024-02-25 18:21:43 +00:00
commit 4993b98258
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")