oeqa/qemurunner: Clean up failure handling

If you fail to setup the tap devices, runqemu will error quickly
however stdout/stderr are not shown to the user, instead a SystemExit
traceback is shown. This could explain some long since unexplained
failures on the autobuilder.

Rework the error handling so SystemExit isn't used and the
standard log failure messages can be shown. The code could
likely ultimatley need some restructuring to work effectively.

(From OE-Core rev: 83b8e66b66aa9848ed9c8761a21cb47c6443d0c6)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2020-04-24 13:23:27 +01:00
parent 9b335fa867
commit e820c86fb9

View File

@@ -36,6 +36,7 @@ class QemuRunner:
# Popen object for runqemu
self.runqemu = None
self.runqemu_exited = False
# pid of the qemu process that runqemu will start
self.qemupid = None
# target ip - from the command line or runqemu output
@@ -124,7 +125,6 @@ class QemuRunner:
self.logger.error('Output from runqemu:\n%s' % self.getOutput(self.runqemu.stdout))
self.stop()
self._dump_host()
raise SystemExit
def start(self, qemuparams = None, get_ip = True, extra_bootparams = None, runqemuparams='', launch_cmd=None, discard_writes=True):
env = os.environ.copy()
@@ -232,6 +232,8 @@ class QemuRunner:
endtime = time.time() + self.runqemutime
while not self.is_alive() and time.time() < endtime:
if self.runqemu.poll():
if self.runqemu_exited:
return False
if self.runqemu.returncode:
# No point waiting any longer
self.logger.warning('runqemu exited with code %d' % self.runqemu.returncode)
@@ -241,6 +243,9 @@ class QemuRunner:
return False
time.sleep(0.5)
if self.runqemu_exited:
return False
if not self.is_alive():
self.logger.error("Qemu pid didn't appear in %s seconds (%s)" %
(self.runqemutime, time.strftime("%D %H:%M:%S")))
@@ -416,7 +421,7 @@ class QemuRunner:
os.killpg(os.getpgid(self.runqemu.pid), signal.SIGKILL)
self.runqemu.stdin.close()
self.runqemu.stdout.close()
self.runqemu = None
self.runqemu_exited = True
if hasattr(self, 'server_socket') and self.server_socket:
self.server_socket.close()
@@ -457,7 +462,7 @@ class QemuRunner:
return False
def is_alive(self):
if not self.runqemu or self.runqemu.poll() is not None:
if not self.runqemu or self.runqemu.poll() is not None or self.runqemu_exited:
return False
if os.path.isfile(self.qemu_pidfile):
# when handling pidfile, qemu creates the file, stat it, lock it and then write to it