nixos/test-driver: fix resource cleanup of vlan/qmp objects

Using __del__ is somewhat unsound resource cleanup in our clase the
logger already closed its logfile and therefor fails with exception
before the rest of the resources can be cleaned up.
This commit is contained in:
Jörg Thalheim 2024-10-16 19:44:43 +03:00
parent 8e125ab277
commit ef9502a009
4 changed files with 15 additions and 3 deletions

View File

@ -99,7 +99,16 @@ class Driver:
with self.logger.nested("cleanup"): with self.logger.nested("cleanup"):
self.race_timer.cancel() self.race_timer.cancel()
for machine in self.machines: for machine in self.machines:
machine.release() try:
machine.release()
except Exception as e:
self.logger.error(f"Error during cleanup of {machine.name}: {e}")
for vlan in self.vlans:
try:
vlan.stop()
except Exception as e:
self.logger.error(f"Error during cleanup of vlan{vlan.nr}: {e}")
def subtest(self, name: str) -> Iterator[None]: def subtest(self, name: str) -> Iterator[None]:
"""Group logs under a given test name""" """Group logs under a given test name"""

View File

@ -1234,6 +1234,9 @@ class Machine:
self.monitor.close() self.monitor.close()
self.serial_thread.join() self.serial_thread.join()
if self.qmp_client:
self.qmp_client.close()
def run_callbacks(self) -> None: def run_callbacks(self) -> None:
for callback in self.callbacks: for callback in self.callbacks:
callback() callback()

View File

@ -49,7 +49,7 @@ class QMPSession:
sock.connect(str(path)) sock.connect(str(path))
return cls(sock) return cls(sock)
def __del__(self) -> None: def close(self) -> None:
self.sock.close() self.sock.close()
def _wait_for_new_result(self) -> dict[str, str]: def _wait_for_new_result(self) -> dict[str, str]:

View File

@ -59,7 +59,7 @@ class VLan:
self.logger.info(f"running vlan (pid {self.pid}; ctl {self.socket_dir})") self.logger.info(f"running vlan (pid {self.pid}; ctl {self.socket_dir})")
def __del__(self) -> None: def stop(self) -> None:
self.logger.info(f"kill vlan (pid {self.pid})") self.logger.info(f"kill vlan (pid {self.pid})")
self.fd.close() self.fd.close()
self.process.terminate() self.process.terminate()