From 47b43acd57e6e0b2910683f00a758adbc418dde6 Mon Sep 17 00:00:00 2001 From: John Snow Date: Thu, 11 Nov 2021 09:37:17 -0500 Subject: scripts/device-crash-test: simplify Exception handling We don't need to handle KeyboardInterruptError specifically; we can instead tighten the scope of the broad Exception handlers to only catch "Exception", which has the effect of allowing all BaseException classes that do not inherit from Exception to be raised through. KeyboardInterruptError and a few other important ones are BaseExceptions, so this does the same thing with less code. Signed-off-by: John Snow Reported-by: Thomas Huth Tested-by: Thomas Huth Message-id: 20211111143719.2162525-4-jsnow@redhat.com Signed-off-by: John Snow --- scripts/device-crash-test | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'scripts') diff --git a/scripts/device-crash-test b/scripts/device-crash-test index 8331c057b8..d91e8616ef 100755 --- a/scripts/device-crash-test +++ b/scripts/device-crash-test @@ -317,9 +317,7 @@ class QemuBinaryInfo(object): try: vm.launch() mi['runnable'] = True - except KeyboardInterrupt: - raise - except: + except Exception: dbg("exception trying to run binary=%s machine=%s", self.binary, machine, exc_info=sys.exc_info()) dbg("log: %r", vm.get_log()) mi['runnable'] = False @@ -360,9 +358,7 @@ def checkOneCase(args, testcase): exc_traceback = None try: vm.launch() - except KeyboardInterrupt: - raise - except: + except Exception: exc_traceback = traceback.format_exc() dbg("Exception while running test case") finally: -- cgit v1.2.3-55-g7522 From 76f86e78b255d17aad2ebd1177069c86f08039ef Mon Sep 17 00:00:00 2001 From: John Snow Date: Thu, 11 Nov 2021 09:37:18 -0500 Subject: scripts/device-crash-test: don't emit AQMP connection errors to stdout These errors are expected, so they shouldn't clog up terminal output. In the event that they're *not* expected, we'll be seeing an awful lot more output concerning the nature of the failure. Reported-by: Thomas Huth Signed-off-by: John Snow Tested-by: Thomas Huth Message-id: 20211111143719.2162525-5-jsnow@redhat.com Signed-off-by: John Snow --- scripts/device-crash-test | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'scripts') diff --git a/scripts/device-crash-test b/scripts/device-crash-test index d91e8616ef..49bcd61b4f 100755 --- a/scripts/device-crash-test +++ b/scripts/device-crash-test @@ -499,6 +499,12 @@ def main(): lvl = logging.WARN logging.basicConfig(stream=sys.stdout, level=lvl, format='%(levelname)s: %(message)s') + if not args.debug: + # Async QMP, when in use, is chatty about connection failures. + # This script knowingly generates a ton of connection errors. + # Silence this logger. + logging.getLogger('qemu.aqmp.qmp_client').setLevel(logging.CRITICAL) + fatal_failures = [] wl_stats = {} skipped = 0 -- cgit v1.2.3-55-g7522 From c398a241ec4138e0b995a0215dea84ca93b0384f Mon Sep 17 00:00:00 2001 From: John Snow Date: Thu, 11 Nov 2021 09:37:19 -0500 Subject: scripts/device-crash-test: hide tracebacks for QMP connect errors Generally, the traceback for a connection failure is uninteresting and all we need to know is that the connection attempt failed. Reduce the verbosity in these cases, except when debugging. Signed-off-by: John Snow Reported-by: Thomas Huth Tested-by: Thomas Huth Message-id: 20211111143719.2162525-6-jsnow@redhat.com Signed-off-by: John Snow --- scripts/device-crash-test | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'scripts') diff --git a/scripts/device-crash-test b/scripts/device-crash-test index 49bcd61b4f..3db0ffe5b8 100755 --- a/scripts/device-crash-test +++ b/scripts/device-crash-test @@ -36,6 +36,7 @@ from itertools import chain sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'python')) from qemu.machine import QEMUMachine +from qemu.aqmp import ConnectError logger = logging.getLogger('device-crash-test') dbg = logger.debug @@ -355,10 +356,12 @@ def checkOneCase(args, testcase): dbg("will launch QEMU: %s", cmdline) vm = QEMUMachine(binary=binary, args=args) + exc = None exc_traceback = None try: vm.launch() - except Exception: + except Exception as this_exc: + exc = this_exc exc_traceback = traceback.format_exc() dbg("Exception while running test case") finally: @@ -366,8 +369,9 @@ def checkOneCase(args, testcase): ec = vm.exitcode() log = vm.get_log() - if exc_traceback is not None or ec != 0: - return {'exc_traceback':exc_traceback, + if exc is not None or ec != 0: + return {'exc': exc, + 'exc_traceback':exc_traceback, 'exitcode':ec, 'log':log, 'testcase':testcase, @@ -455,6 +459,17 @@ def logFailure(f, level): for l in f['log'].strip().split('\n'): logger.log(level, "log: %s", l) logger.log(level, "exit code: %r", f['exitcode']) + + # If the Exception is merely a QMP connect error, + # reduce the logging level for its traceback to + # improve visual clarity. + if isinstance(f.get('exc'), ConnectError): + logger.log(level, "%s.%s: %s", + type(f['exc']).__module__, + type(f['exc']).__qualname__, + str(f['exc'])) + level = logging.DEBUG + if f['exc_traceback']: logger.log(level, "exception:") for l in f['exc_traceback'].split('\n'): -- cgit v1.2.3-55-g7522